2010-10-04 45 views

回答

6

嗯,有問題的是__proto__是非標準(link),而不是所有的實現支持。 :-)除此之外,constructor屬性(link)設置不正確,你可能必須自己做。另外,我認爲在調用構造函數之前,最好先設置原型。所以:

function A(name) { 
    this.name = name; 
} 

var a1 = {}; 
a1.__proto__ = A.prototype; 
a1.constructor = A; // <=== Added this bit 
A.call(a1, "A1"); // <=== Moved this down 

已經很接近了,不過,至少在支持__proto__實現。我不打賭完全一樣。值得閱讀ECMAScript第5版規範的更多細節,具體部分11.2.2「new運營商」和13.2.2「[[構造]]」。

不支持__proto__可以支持第5版規範(第15.2.3.5),它允許您與特定的原型創建一個對象定義的新Object.create功能有些實現。在支持Object.create實現,創造a1代碼是這樣的:

var a1 = Object.create(A.prototype); 
a1.constructor = A; 
A.call(a1, "A1"); 

滾動起來,則:

function A(name) { 
    this.name = name; 
} 

if (typeof Object.create === "function") { 
    a1 = Object.create(A.prototype); 
} 
else if ({}.__proto__) { 
    a1 = {}; 
    a1.__proto__ = A.prototype; 
} 
else { 
    /* Fail */ 
} 
a1.constructor = A; 
A.call(a1, "A1"); 

...但這是完全未經測試,並再次,我不會指望它是正好同樣禁止一個非常接近的規範確實閱讀。

只要有可能,當然,如果你正在處理構造函數,我建議以正常方式使用它。不過,像__proto__Object.create這樣的高級工具對於做純原型繼承(不需要構造函數)非常有用。

+0

很棒的回答。謝謝。 – zod 2010-10-04 14:32:49

相關問題