因此,我已经阅读了有关 JavaScript 中组合继承的主题。我知道目的是使用原型链来继承属性和方法——并使用构造函数窃取来继承实例属性。
我提供了一个让我难以置信并阻止我完全理解这个概念的例子。
简而言之,我创建了一个 SuperColors 父函数,它通过在 SubColors 构造函数方法中的 call() 执行将其属性传递给 SubColors。据我了解,这应该允许实例(instance1)拥有自己的颜色属性,正如我所展示的那样。
这是古怪的部分。我删除了 instance1 的颜色属性。这应该意味着当我推送新颜色时,他们应该将 SuperColors 颜色属性操作为完整的彩虹。然后,当我创建 SubColors 的新实例(instance2)时,它们应该继承彩虹。
他们没有。如果我们查看 console.log() 中的 instance2,颜色被实例化为“Red,Orange,Yellow”,尽管我们可以清楚地看到 SuperColor 的 color 属性具有整个彩虹。
这对我来说没有意义——我是否错误地理解了原型继承,或者这是出乎意料的语言的奇怪怪癖?
function SuperColors() {
this.colors = ["red", "orange", "yellow"];
}
SuperColors.prototype.sayColors = function () {
alert("SuperColors " + this.colors);
};
function SubColors() {
//inherit properties
SuperColors.call(this);
}
// inherit methods
SubColors.prototype = new SuperColors();
SubColors.prototype.sayRainbow = function () {
alert(this.colors + "a whole rainbow!");
};
// create an instance of SubColors
var instance1 = new SubColors();
// push colors to colors property on instance
instance1.colors.push("green", "blue", "purple");
alert(instance1.colors); // "red, orange, yellow, green, blue, purple"
instance1.sayColors(); // "SuperColors red,orange,yellow,green,blue,purple";
// delete instance of colors
delete(instance1.colors);
console.log(instance1);
// this should manipulate SuperColor's constructor of colors
instance1.colors.push("green", "blue", "purple");
// instantiate a new SubColor object that should inherit SuperColor's entire rainbow
var instance2 = new SubColors();
alert(instance1.colors);
alert(instance2.colors); // WHY ISN'T THIS THE ENTIRE RAINBOW? It should have been instantiated with SuperColor's modified colors.
console.log(instance2); // Shows that SuperColors.colors has the rainbow, but the instance has only 3 colors?