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