在构造函数内部分配原型

10

我有这段代码:

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());
输出告诉我a没有名为getA()的方法。 我假设在SecondClass构造函数内部执行this.prototype = new MyClass()将使它继承MyClass的方法? 我确定有更好的方法来做这件事,但我想要理解原型关键字的行为。

1
"prototype" 不是一个关键字。 - Pointy
2
return that.a; 应该改为 return this.a; - Felix Kling
2个回答

15

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

当你使用new Func()调用构造函数时,引擎会创建一个新对象,该对象继承自Func.prototype,然后将构造函数内部的this设置为指向新对象。

因此,除了this.prototype只是普通的属性之外,在赋值发生时,继承已经发生了。

由于你没有给MyClass.prototype分配任何方法,在这里你不需要做任何原型继承。你所要做的就是使用.call [MDN]MyClass应用于新创建的实例:

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

然而,你应该将所有实例共享的方法添加到原型中,然后让每个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());

所有这些在ES6中将变得更容易


2
谢谢,这有助于让事情更加清晰。只是为了澄清,我认为 MyClass.prototype 只是 Object 的一个实例。因此,当我将东西分配给 MyClass.prototype 时,它只会将它们分配给对象的特定实例(即 MyClass 的原型),而不是 Object "类" 本身。谢谢 - user350325

4

"prototype"属性只对函数对象有意义。在构造函数中给“prototype”属性赋值没有效果(在这种情况下),重要的是构造函数本身的“prototype”属性。

SecondClass.prototype = new MyClass();

或者其他什么东西。一个构造函数的原型对象被所有实例共享,因此通过构造函数参数使原型发生变化也没有太多意义。

另一件事情是可以在“SecondClass”内部调用“MyClass”构造函数:

function SecondClass(b) {
  MyClass.call(this, b);
  this.getB = function() {
    return 6;
  };
}

这将使在new SecondClass()调用中构造的this被"MyClass"构造函数装饰。这并不是真正的继承,但你会得到一个"getA"函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接