我有这个代码:
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.prototype并this在构造函数内部设置以引用新对象.
因此,除了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中都会变得更容易.