2013-01-06 62 views
1

鑑於JavaScript代碼:多態constructor.name屬性訪問

function Parent() { ... } 
function Child() { ... } 

Child.prototype = new Parent(); 

// toString implementation on the parent object 
Parent.prototype.toString = function() { 
    return this.constructor.name; 
} 

// And the code: 
alert(new Child()); 

...將輸出「父」的時候,想要的結果是讓「孩子」字符串回(父toString裏面執行constructor.name應該返回子構造函數名稱)。

這可能在JavaScript?

+1

從https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/constructor,'constructor':_Returns對創建實例的prototype_的Object函數的引用。所以它正在做它應該做的事情,你正在尋找替代功能(除了'constructor'之外的其他功能)。有很多文章模仿古典風格的子類,如果這就是你想要的,或者你也可以去更簡單的寄生繼承路線。 –

回答

0

您在代碼結果看到的不一致是由兩個引起reasons.first的一切,如果你檢查兒童原型對象與Object.getPrototypeOf(Child)function Empty(){},所以糾正原型對象分配,你應該使用Child.__proto__ = new Parent(),而不是Child.prototype = new Parent();。第二的其所有的事情原型鏈。如果你看到Object.getPrototypeOf(Child)新的賦值後的結果,你得到[object Object]萬一你沒有定義父原型toString()方法。如果你有,然後它返回父子原型)原型toString()方法),這意味着兒童具有對象在其原型屬性。然後你有三個選擇:

1.assign一個toString()方法,以兒童對象本身:

Child.toString = function(){ return this.name } 

在這種情況下,你不應該因爲經過原型分配它的構造已更改爲使用this.constructor.name父母

2.define兒童原型(父)toString()方法:

Child.__proto__.toString = function(){ return this.name } 

3.define兒童原型的>原型(對象)toString()方法:(倍率

Parent.prototype.toString = function(){ return this.name } 

一些意見:我用__proto__的屁股

1.原因在開始的時候,我想要訪問對象構造函數的原始原型屬性並改變它。

2.I've使用return this.name因爲這些方法會從兒童被調用,因此它refrences子對象。我在選項2prototype選項3使用__proto__

3,原因是我們使用__proto__當對象構造發生了變化,prototype當對象的構造並沒有改變。

4.to測試toString()方法你應該使用alert(Child)而不是alert(new Child())

下面是一篇文章,可以幫助你很多關於原型:

http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/

這個答案的所有方面都與Chrome瀏覽器JS控制檯進行測試。