JavaScript中构造函数指针行为背后的基本原理是什么?

时间:2009-01-16 09:52:31

标签: javascript oop

考虑到简单的场景:

function Base() {}
function Child() {}
Child.prototype = new Base;

我想知道为什么Child的实例将构造函数属性设置为Base而不是Child?

2 个答案:

答案 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属性重新分配给一个新对象时,您将用新的属性替换旧的构造函数属性。

如果您不希望这种情况发生,您必须逐个为原型对象分配属性,而不是一次将整个原型属性分配给新对象。或者之后替换旧的构造函数属性。

更好的主意:不要依赖构造函数属性做任何重要的事情。