Object.create()およびtoString()

これらのコード

var Person = function(firstName, lastName) {
  this.firstName = firstName;
  this.lastName = lastName;
};

Person.prototype = {
  toString: function() { return this.firstName + ' ' + this.lastName; }
};

var test4 = Object.create(Person);
test4.firstName = "Phat4";
test4.lastName = "Wang4";
console.log(test4.toString === Object.toString);//true
console.log(test4.toString === Function.toString);//true

var test5 = { firstName: "Phat5", lastName: "Wang5" };
console.log(test5.toString === test4.toString);//false
console.log(test4.toString === Function.toString);//true
console.log(test5.toString === Object.prototype.toString);//true

console.log(test5.toString());//[object Object]
console.log(test4.toString());//Function.prototype.toString called on incompatible object

最後の行 console.log(test4.toString())がエラーをスローするのはなぜですか? test4.toString test5.toString のようではありませんが、私はそれを取得しません。

Ps。私はスレッドを検索しようとしたが、まだ自分自身に答えることはできません。これがanyと重複していれば、申し訳ありません。

4
node.js?またはブラウザで?
追加された 著者 chakrit,

3 答え

これの代わりに:

var test4 = Object.create(Person);

あなたはしている必要があります:

var test4 = Object.create(Person.prototype);

あなたが持っていた方法では、 test4 にプロトタイプチェーンで toString というプロトタイプオブジェクトがない Person /code>メソッドを使用します。

このため、 Function オブジェクトに対して呼び出されることが予想される toString()メソッドを使用していました。

3
追加された
@PhatWangrungarun:はい、一般的な Object.prototype.toString メソッドをオーバーライドします。
追加された 著者 RightSaidFred,
したがって、Objectから継承された toString()メソッドをオーバーライドする test4.toString() Function.toString()です。
追加された 著者 Phat Wangrungarun,
ありがとう!
追加された 著者 Phat Wangrungarun,

プロトタイプに割り当てることと、オブジェクトのプロトタイプに新しいプロパティを割り当てることには違いがあります。

あなたは関数Personをコンストラクタ関数として宣言しましたが、次にこれを行うことでプロトタイプに何かを割り当てています:

Person.prototype = {
  toString: function() { return this.firstName + ' ' + this.lastName; }
};

これは、実際に新しいプロパティを追加するのではなく、Person.prototypeに新しいオブジェクトキー値のペアtoString-functionを割り当てることを意味します。

Person.prototype.toString = function() { return this.firstName + ' ' + this.lastName; }

これは、 Object.create を呼び出してPersonオブジェクトから継承する新しいオブジェクトを実際に作成しているときに、新しいオブジェクトが新しく作成され、以前のコードでその Person.prototype の割り当てを行って、javascriptが作成したと仮定したプロトタイププロパティをオーバーライドする新しいオブジェクトを返します。

0
追加された
var Person = function(firstName, lastName) { 
    this.firstName = firstName; 
    this.lastName = lastName;
  }; var p1=new Person("Phat1","Wang1");

p1はオブジェクトです

var p2= Object.create(Person);
p2.firstName="Phat2";
p2.lastName="Wang2";

p2は関数

0
追加された
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript