2011-12-19 67 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 

爲什麼最後一行console.log(test4.toString())拋出錯誤?它顯示test4.toString是不是像test5.toString,但我不明白它..

Ps。我試過尋找線索,仍然無法回答自己。對不起,如果這與任何重複。

+0

的node.js?或在瀏覽器中? – chakrit

回答

3

取而代之的是:

var test4 = Object.create(Person); 

你應該做的事:

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

你有它的方式,test4在其原型鏈有Person功能,而不是預期的原型對象那有你的toString方法。

因此,它使用的是一個toString()方法,顯然預計會針對對象調用該方法。

+0

因此,意思'test4.toString()'是'Function.toString()',它覆蓋了從Object繼承的'toString()'方法,對吧? –

+0

@PhatWangrungarun:是的,它覆蓋了Object.prototype.toString方法,它是通用方法。 – RightSaidFred

+0

現在得到它,謝謝! –

0

分配給原型並將新屬性分配給對象的原型是有區別的。

你聲明的函數人作爲一個構造函數,但你幾乎做這個分配的東西它的原型:

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

這意味着你分配一個新的對象鍵值對的toString功能來Person.prototype的,而不是實際添加了新的屬性吧,你應該這樣做了:

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

從什麼這需要的是當你實際上是在創建一個新的對象,從Person對象繼承呼叫Object.create,那麼在它的實現中會發生什麼是一個新的對象將被新創建,然後它將返回新的對象,它將覆蓋JavaScript假定您已經創建的原型屬性,通過在代碼中執行之前的Person.prototype指定。

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爲一個函數