5
function A(name) {
this.name = name;
}
是:
var a1 = new A("A1");
完全等同於:
var a1 = {};
A.call(a1, "A1");
a1.__proto__ = A.prototype;
?
感謝
function A(name) {
this.name = name;
}
是:
var a1 = new A("A1");
完全等同於:
var a1 = {};
A.call(a1, "A1");
a1.__proto__ = A.prototype;
?
感謝
嗯,有問題的是__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
這樣的高級工具對於做純原型繼承(不需要構造函數)非常有用。
很棒的回答。謝謝。 – zod 2010-10-04 14:32:49