【发布时间】:2014-02-06 00:24:50
【问题描述】:
所以下面的代码反映了 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 变成简单的sound。
我们还假设我真的想创建一个继承链来访问这两个“声音”,即使它们被命名为相同的东西。 JavaScript 社区中是否存在处理这种情况的模式或编码约定?还是我只是卡住了?
谢谢
【问题讨论】:
-
你想用
synthsCombined做什么,你期望什么“组合”?在继承中,子属性会影响父属性是完全正常的——这正是您想要的。也许“继承”不是您problem的解决方案。 -
我没有将这段代码用于任何事情,它只是进入了我的脑海,我很好奇。我可以看到一种情况,至少您组合构造函数时没有意识到它们具有相似的属性/方法名称。我认为可能有一种我不知道的传统“方法”来处理这个问题。
-
问题在于解决方案取决于现实世界的需求。可以/应该在从这些构造函数创建的所有对象之间共享属性的值吗?如果是这样,那么您可以获取原型链中的下一个对象,并获取该值。如果不是,那么一个对象显然不能同时分配两个值。您可能需要一个映射或值数组。再次,一切以实际情况为准。
-
覆盖和扩展父函数包含在这个答案中:stackoverflow.com/a/16063711/1641941 最好使用 Object.create 或辅助函数来设置继承的原型部分,而不是创建 Parent 的实例
标签: javascript inheritance constructor