1

我对如何通过原型继承实现代码重用有点困惑。我正在关注http://alexsexton.com/?p=51上的示例,它创建了一个 Speaker 对象并将其与 jQuery 桥接。

假设我想要一个与示例类似的新扬声器,但现在有一个额外的声音文件。我能想到的唯一代码是:

var AnotherSpeaker = Object.create(Speaker);

$.extend(true, AnotherSpeaker, {
    init: function(options, elem){
        this.options.soundFile = options.soundFile || this.options.soundFile;
        Speaker.init.call(this, options, elem);
    },
    options:{
        soundFile: 'abc.wav'
    },
    _playSound: function(){
        //....code to play the sound this.options.soundFile;
    },
    speak: function(msg){
        this._playSound();
        Speaker.speak.call(this, msg);
    }
});

$.plugin('AnotherSpeaker', AnotherSpeaker); //jquery plugin bridge

但这种方法对我来说实际上听起来很“经典”。我通过Speaker.xxx.call. 我想我应该做差分继承,但不知道怎么做?有什么帮助吗?

4

2 回答 2

0

当面向对象是新事物时,人们普遍认为继承有利于代码重用。较新的观点是继承创造了高度耦合,并且重用通常通过聚合而不是继承更好地实现。

我无法找到您链接到的文章,所以我无法更具体地了解您的情况。

于 2011-07-26T09:46:36.453 回答
0

您已经在进行差异继承(指定AnotherSpeaker与 相对的不同之处Speaker)。

关于您对Speaker.speakvia的“supercall”问题call:是的,这很痛苦。超级调用是 JavaScript 在开箱即用时不能帮助您的领域。使用您使用的结构,这可能是最好的方法。

几年前,我定义了一个系统,让超级调用既简单又高效。它涉及使用辅助函数来创建构造函数(我在文章中称它们为类,这是我当时尚未在脑海中进行类到原型转换的人工制品),但除了术语之外,它是实际上是原型继承。您可能会发现这很有帮助。

于 2011-07-26T09:41:05.013 回答