如何在JavaScript中处理和识别继承冲突?

时间:2014-01-16 21:08:45

标签: javascript inheritance constructor

因此下面的代码反映了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社区中是否存在模式或存在处理此类情况的编码约定?还是我被卡住了?

谢谢

3 个答案:

答案 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