代码之家  ›  专栏  ›  技术社区  ›  Sergey Ilinsky

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

  •  1
  • Sergey Ilinsky  · 技术社区  · 16 年前

    考虑到简单的情况:

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

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

    2 回复  |  直到 16 年前
        1
  •  4
  •   Christoph    16 年前

    这一切都与继承在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 -而不是构造函数中设置的。

        2
  •  2
  •   Breton    16 年前
    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
    

    基本上,原型的任何属性都成为实例的属性,包括“构造函数”

    当您将整个原型属性重新分配给一个新对象时,您将用新的构造函数属性替换旧的构造函数属性。

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

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