在构造函数中分配原型

use*_*325 10 javascript

我有这个代码:

var MyClass = function(b) {
    this.a = b;
    this.getA = function() {
        return that.a;
    }
}

var SecondClass = function(b) {
    this.prototype = new MyClass(b);
    this.getB = function() {
        return 6;
    }
}

var a = new SecondClass(2);
console.log(a.getA());
Run Code Online (Sandbox Code Playgroud)

输出告诉我a没有名为getA()的方法

我假设在SecondClass的构造函数中执行this.prototype = new MyClass()会导致它从MyClass的inhert方法?

我确信有更好的方法可以做到这一点,但我试图理解prototype关键字的行为.

Fel*_*ing 14

prototype构造函数的特殊属性,而不是实例的特殊属性.

当您使用构造函数调用时new Func(),引擎将创建一个新对象,该对象继承Func.prototypethis在构造函数内部设置以引用新对象.

因此,除了this.prototype仅仅是一个普通的财产,继承已经发生在分配时.

由于您没有分配任何方法MyClass.prototype,因此您无需在此处执行原型继承.您所要做的就是MyClass使用.call [MDN]应用于新创建的实例:

var SecondClass = function(b) {
    MyClass.call(this, b);
    this.getB = function() {
        return 6;
    }
};
Run Code Online (Sandbox Code Playgroud)

但是,您应该将实例共享的所有方法添加到原型中,然后让每个实例SecondClass继承它.这就是完整设置的样子:

var MyClass = function(b) {
    this.a = b;
}
MyClass.prototype.getA = function() {
    return this.a;
};

var SecondClass = function(b) {
    // call parent constructor (like 'super()' in other languages)
    MyClass.call(this, b);
}
// Setup inheritance - add 'MyClass.prototype' to the prototype chain
SecondClass.prototype = Object.create(MyClass.prototype);
SecondClass.prototype.getB = function() {
    return 6;
};

var a = new SecondClass(2);
console.log(a.getA());
Run Code Online (Sandbox Code Playgroud)

所有这一切在ES6中都会变得更容易.

  • 谢谢,这有助于使事情更清晰.为了澄清,我假设MyClass.protoype只是Object的一个实例.因此,当我将内容分配给MyClass.prototype时,它只将它们分配给对象的特定实例(即MyClass的原型),而不是对象"类"本身.谢谢 (2认同)