constructor
是原型對象的一個普通的屬性(與DontEnum
標誌已設置,因此它不會出現在for..in
循環中)。如果您替換原型對象,constructor
屬性也將被替換 - 有關更多詳細信息,請參閱this explanation。
您可以通過手動設置Obj2.prototype.constructor = Obj2
來解決問題,但這種方式將不會設置DontEnum
標誌。
由於這些問題,依靠constructor
進行類型檢查並不是一個好主意:請使用instanceof
或isPrototypeOf()
代替。
安德烈·費奧多羅夫問爲什麼new
不會在constructor
屬性分配給實例對象,而不是問題。我想原因如下:
從相同的構造函數創建的所有對象共享構造函數屬性,共享屬性駐留在原型中。
真正的問題是JavaScript沒有對繼承層次結構的內置支持。周圍有問題的幾種方法(你是其中之一),「在精神」的JavaScript的另一個更將是以下幾點:
function addOwnProperties(obj /*, ...*/) {
for(var i = 1; i < arguments.length; ++i) {
var current = arguments[i];
for(var prop in current) {
if(current.hasOwnProperty(prop))
obj[prop] = current[prop];
}
}
}
function Obj1(arg1) {
this.prop1 = arg1 || 1;
}
Obj1.prototype.method1 = function() {};
function Obj2(arg1, arg2) {
Obj1.call(this, arg1);
this.test2 = arg2 || 2;
}
addOwnProperties(Obj2.prototype, Obj1.prototype);
Obj2.prototype.method2 = function() {};
這使得多重繼承小事爲好。
`constructor`之間的所有實例對象來自同一個構造函數創建了共享的屬性,因此,把它放在原型中是正確的;只是JS沒有內置的(深層)繼承層次支持 - 我會給我的答案添加一個解釋...... – Christoph 2009-02-12 14:10:29