2011-12-19 13 views
4

は、これらのコード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 

を考えると?それはtest4.toStringtest5.toStringのようではないことを示していますが、私はそれを取得しません..

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

+0

Node.jsの機能ですか?またはブラウザで? – chakrit

答えて

3

の代わりにこの:

var test4 = Object.create(Person); 

あなたがやるべきこと:

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

をあなたはそれを持っていた方法で、test4はそのプロトタイプチェーンではなく、意図したプロトタイプオブジェクトにPerson機能を持っていましたそれはあなたのtoStringメソッドを持っています。

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

+0

'test4.toString()'の意味は、Objectから継承した 'toString()'メソッドをオーバーライドする 'Function.toString()'です。 –

+0

@PhatWangrungarun:はい、それはジェネリックオブジェクトである 'Object.prototype.toString'メソッドをオーバーライドします。 – RightSaidFred

+0

今すぐお試しください! –

0

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

あなたはコンストラクタ関数としての機能パーソンを宣言したが、その後、あなたはかなりこれを行うことによって、そのプロトタイプに何かを割り当てる:

あなたに新しいオブジェクトのキーと値のペアのtoString機能を割り当てること
Person.prototype = { 
    toString: function() { return this.firstName + ' ' + this.lastName; } 
}; 

代わりに、実際にはこのように行っているべきで、それに新しいプロパティを追加するPerson.prototype、:

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

これは何から必要とすることは、あなたが実際で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のオブジェクトである

関連する問題