如何处理和辨别JavaScript中的继承冲突



因此,下面的代码反映了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)

但让我们将其更改为使sound1sound2变为简单的声音

我们还假设我真的想创建一个继承链来访问这两个"声音",即使它们的名称是相同的。JavaScript社区中是否存在处理这种情况的模式或编码约定?还是我被卡住了?

谢谢

子属性隐藏原型链上更远的同名属性。从技术上讲,你仍然可以访问这样的父属性:

Object.getPrototypeOf(synthsCombined).sound

或者非标准:

synthsCombined.__proto__.sound

但这可能不是你想做的事情。如果你需要两个值,那么给它们命名不同的东西。

这只是我脑海中的一件事,我对此感到好奇。我可以看到这样一种情况,即至少您组合构造函数时没有意识到它们具有相似的属性/方法名称。

您很难从属性集1不知道的类继承。如果你对某个东西进行子类化,你通常想要用更具体的值显式地覆盖属性——这正是阴影的作用。

如果你想扩展集合,你必须选择一个未分配的名称。在接口冲突的情况下(例如,在扩展实现时),这只是一个错误,基类或子类都需要更改它们的标识符。使用描述性名称会降低风险。

如何应对这种情况?

如果不需要,请修复错误(这不是JavaScript特有的)。如果您故意选择了相同的属性名称,则可以通过使用Object.getPrototypeOf()手动提升原型链来访问继承的值。

[1]:说到属性和方法,因为它们只是javascript中的属性

您可以给其中一个构造函数一个基属性,它将从继承的构造函数中获取属性:

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类来组合不同的Synths可能更有意义。

最新更新