因此下面的代码反映了JavaScript中的伪经典继承版本。
function SynthOne() { // constructor 1
this.sound1 = "piano";
};
function SynthTwo() { // constructor 2
this.sound2 = "bass";
}
SynthOne.prototype = new SynthTwo; // overwrite constructor 1's prototype with constructor 2's
var synthsCombined = new SynthOne; // assign constructor 1 to variable
// this variable now has access to both constructors properties & methods
document.write(synthsCombined.sound1 + " ")
document.write(synthsCombined.sound2)
但是让我们改变这一点,使 sound1 和 sound2 简单地声音。
让我们假设我真的想创建一个继承链来访问这两个“声音”,即使它们被命名为相同的东西。 JavaScript社区中是否存在模式或存在处理此类情况的编码约定?还是我被卡住了?
谢谢
答案 0 :(得分:3)
子属性在原型链的后面隐藏同名的属性。从技术上讲,您仍然可以像这样访问父属性:
Object.getPrototypeOf(synthsCombined).sound
或非标准:
synthsCombined.__proto__.sound
但这可能不是你想做的事情。如果您需要两个值,请将它们命名为不同的东西。
答案 1 :(得分:1)
这只是进入我脑海的事情,我很好奇。我可以看到一种情况,至少你组合构造函数没有意识到他们有类似的属性/方法名称。
您几乎不会继承您不知道属性 1 的类。如果你继承了某些东西,你经常想要用更具体的值显式覆盖属性 - 这就是阴影的用途。
如果您想扩展该集,则必须选择未分配的名称。在接口冲突的情况下(例如,在扩展实现时),这只是一个错误,基类或子类需要更改其标识符。使用描述性名称可以降低风险。
如何处理这种情况?
如果不需要,请修复错误(这不是特定于JavaScript的)。如果您故意选择了相同的属性名称,则可以通过使用Object.getPrototypeOf()
手动提升原型链来访问继承的值。
[1]:说到属性和方法,因为它们只是javascript中的属性
答案 2 :(得分:0)
你可以给你的一个构造函数一个基本属性,它将从继承的构造函数中获取属性:
function SynthOne() { // constructor 1
this.base = {};
this.sound = "piano";
SynthTwo.call(this.base);
};
function SynthTwo() { // constructor 2
this.sound = "bass";
}
SynthOne.prototype = Object.create(SynthTwo.prototype);
var synthsCombined = new SynthOne;
console.log(synthsCombined.sound); //piano
console.log(synthsCombined.base.sound); //bass
但是从你想要完成的事情来看,也许继承对你来说不是正确的方式。创建通用Synth
类和SynthCollection
类可能更有意义,以组合不同的Synth
。