假設我正在拍攝應用程序中的一些基本繼承,我可以通過將我的孩子的原型設置爲父項來實現此目的。在JavaScript中安全地繼承原型
// 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
?
也許下面的答案會對你有幫助,它涵蓋構造函數,原型,繼承和混合ins:http://stackoverflow.com/a/16063711/1641941 – HMR 2014-10-27 23:53:48
@spender你的意思是'Toyota.prototype = Object.create(Car.prototype)'不是嗎?最好不要創建一個Parent實例作爲Child的原型。 – HMR 2014-10-27 23:54:53
@HMR:是的,我刪除了我的答案,因爲我很清楚,我在JS中的繼承知識有些缺陷。忘了也刪除評論。 – spender 2014-10-28 00:17:09