【发布时间】:2014-10-27 20:02:33
【问题描述】:
假设我正在为我的应用程序中的一些基本继承进行拍摄,我可以通过将我的孩子的原型设置为父母来实现这一点。
// Parent "class"
var Car = function(year) {
this.year = year;
};
Car.prototype.drive = function() {
console.log('Vrooom');
};
// Child "class"
var Toyota = function() {
Car.apply(this, arguments);
};
Toyota.prototype = Car.prototype;
var myCar = new Car(2010), myToyota = new Toyota(2010);
myCar.drive(); // Vrooom
myToyota.drive(); // Vrooom
似乎可行,但显然很糟糕,因为如果我在 Toyota.prototype 上设置新方法,它将在 Car 的原型上设置。
Toyota.prototype.stop = function() {
console.log('stooop');
};
myCar.stop(); // stooop <--- bad
myToyota.stop(); // stooop <--- good
为了解决这个问题,我可以添加一个中介来代替Toyota.prototype = Car.prototype;:
var ctor = function() { };
ctor.prototype = Car.prototype;
Toyota.prototype = new ctor();
Toyota.prototype.stop = function() {
console.log('stooop');
};
myCar.stop(); // throws undefined error <--- good
myToyota.stop(); // stooop <--- good
但我不明白为什么会这样。 ctor 创建一个新实例,其原型设置为Car's 原型,然后Toyota 将其原型设置为该新实例。
但是为什么要创建一个空对象,其原型会被Toyota 的原型引用?
为什么不像在第一个示例中那样在Toyota 上设置新方法在Car 上设置它?
如果我想要几层继承怎么办,似乎我每次都需要用new ctor将它们粘合在一起?
【问题讨论】:
-
也许下面的答案会对你有所帮助,它涵盖了构造函数、原型、继承和混入:stackoverflow.com/a/16063711/1641941
-
@spender 你的意思是
Toyota.prototype = Object.create(Car.prototype)不是吗?最好不要创建 Parent 的实例用作 Child 的原型。 -
@HMR:是的,我删除了我的答案,因为很明显我对 JS 继承的了解有些缺陷。也忘记删除评论了。
-
@HMR 很棒的帖子,感谢您写下它并指向它。
标签: javascript inheritance prototype prototypal-inheritance