考虑到简单的场景:
function Base() {} function Child() {} Child.prototype = new Base;
我想知道为什么Child的实例将构造函数属性设置为Base而不是Child?
答案 0 :(得分:4)
这完全与继承在JavaScript中的工作方式有关。请查看this link以获取详细说明(基本上,constructor
只是原型的另一个属性。)
编辑:此外,如果您想要“真正的”原型继承,您必须使用某种克隆功能,例如
function clone(obj) {
if(typeof obj !== 'undefined') {
arguments.callee.prototype = Object(obj);
return new arguments.callee;
}
}
然后,你可以做这样的事情
function Base() {}
function Sub() {}
Sub.prototype = clone(Base.prototype);
var obj = new Sub;
,你仍然会在
上两次true
document.writeln(obj instanceof Sub);
document.writeln(obj instanceof Base);
与您的解决方案的不同之处在于,Base()
将不会被调用,Sub.prototype
将仅继承Base.prototype
的属性 - 而不是构造函数中设置的属性。
答案 1 :(得分:2)
function Base() {}
//Base.prototype.constructor === Base
function Child() {}
//Child.prototype.constructor === Child;
var b = new Base;
//b.constructor = Base;
Child.prototype = b;
//Child.prototype.constructor === Base
基本上,原型的任何属性都成为实例的属性,包括“构造函数”
当您将整个prototype属性重新分配给一个新对象时,您将用新的属性替换旧的构造函数属性。
如果您不希望这种情况发生,您必须逐个为原型对象分配属性,而不是一次将整个原型属性分配给新对象。或者之后替换旧的构造函数属性。
更好的主意:不要依赖构造函数属性做任何重要的事情。