在Backbone.js中使用多个插件

在Backbone.js中使用多个插件,backbone.js,Backbone.js,Backbone.js中的插件模型非常好,但我想知道的是,是否可以在不修改任何插件源代码的情况下使用多个插件 例如,假设我为集合编写了两个插件: MyBetterCollection = Backbone.Collection.extend({ coolNewFeature: function () { console.log('This feature is great.'); } }); MyWayBetterCollection = Backbone.C

Backbone.js中的插件模型非常好,但我想知道的是,是否可以在不修改任何插件源代码的情况下使用多个插件

例如,假设我为
集合编写了两个插件:

MyBetterCollection = Backbone.Collection.extend({
    coolNewFeature: function () {
        console.log('This feature is great.');
    }

});

MyWayBetterCollection = Backbone.Collection.extend({
    wayCoolerNewFeature: function () {
        console.log('This feature is even better.');
    }

});
我已经看到了一些潜在的问题,例如,如果两个插件都覆盖了
add
方法之类的内容。但必须修改第三方插件将是一件令人沮丧的事:

MyWayBetterCollection = MyBetterCollection.extend({
    ...
});

有没有处理这种情况的好方法?

您上面定义的两个集合是完全独立的。它们只是从Backbone.Controller继承方法,如果您定义了具有类似名称的方法,那么您将覆盖这些方法

在其他编程语言中将主干视为类继承。基本上,您可以像使用其他语言一样扩展Backbone.Collection

因此,可以调用超类,如下所示

var MyCollection = Backbone.Collection({
    toJSON: function() {
        var toJSON = this.constructor.__super__.toJSON.call(this);
        toJSON.extra = 'my extra value';
        return toJSON;
    });

即使您扩展了自己的集合,逻辑仍然存在。

您上面定义的两个集合是完全独立的。它们只是从Backbone.Controller继承方法,如果您定义了具有类似名称的方法,那么您将覆盖这些方法

在其他编程语言中将主干视为类继承。基本上,您可以像使用其他语言一样扩展Backbone.Collection

因此,可以调用超类,如下所示

var MyCollection = Backbone.Collection({
    toJSON: function() {
        var toJSON = this.constructor.__super__.toJSON.call(this);
        toJSON.extra = 'my extra value';
        return toJSON;
    });

即使您扩展了自己的收藏,逻辑仍然存在。

要做到这一点并不容易。由于JavaScript中没有传统的继承,因此很难提供这种功能

您必须找到设计用于相互协作的插件,或者将它们分叉并使其兼容


您还可以提供自己的扩展方法,该方法将使用拦截器模式或某种类型的monkey补丁来提供对以前被覆盖原型中被覆盖方法的访问

这不是一个简单的方法。由于JavaScript中没有传统的继承,因此很难提供这种功能

您必须找到设计用于相互协作的插件,或者将它们分叉并使其兼容


您还可以提供自己的扩展方法,该方法将使用拦截器模式或某种类型的monkey补丁来提供对以前被覆盖原型中被覆盖方法的访问

JavaScript没有
super
。原型继承,特别是当您使用下划线/主干中的
extend
时,会专门覆盖任何名称冲突,并且不会提供调用以前版本的方法--它已经100%消失了。让我们看一个JSFIDLE,它显示了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。谢谢你的回答。我知道扩展一个
主干.Collection
会覆盖所有共享相同名称的方法,这就是我的问题所在。我想知道是否有一种方法可以协调地融合扩展同一主干对象的多个插件。听起来好像没有。@tkone,当然,Javascript中没有super,但主干中有super,只要您的原始主干和扩展主干不使用相同的名称,至少上述代码可以正常工作objects@akasha是的,但考虑到它的工作原理“不一样”(wrt覆盖名称)它有潜在的混淆效应,尤其是我想你对这门语言还不熟悉。在编写python并尝试for-in循环之后,我回到js的次数已经够可笑的了:)JavaScript没有
super
。原型继承,特别是当您使用下划线/主干中的
extend
时,会专门覆盖任何名称冲突,并且不会提供调用以前版本的方法--它已经100%消失了。让我们看一个JSFIDLE,它显示了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。谢谢你的回答。我知道扩展一个
主干.Collection
会覆盖所有共享相同名称的方法,这就是我的问题所在。我想知道是否有一种方法可以协调地融合扩展同一主干对象的多个插件。听起来好像没有。@tkone,当然,Javascript中没有super,但主干中有super,只要您的原始主干和扩展主干不使用相同的名称,至少上述代码可以正常工作objects@akasha是的,但考虑到它的工作原理“不一样”(wrt覆盖名称)它有潜在的混淆效应,尤其是我想你对这门语言还不熟悉。在编写python并尝试for-in循环之后,我回到js的次数已经够可笑的了:)这也是我的印象,但我想看看。理由和限制是有道理的,但这实际上限制了您对每个对象类型使用一个插件,除非您想承担维护自己的自定义项目分支的责任。令人失望。是的,我发现JavaScript中有很多类似的东西。这可能会让你感兴趣:然后是:这也是我的印象,但我想看看。理由和限制是有道理的,但这实际上限制了您对每个对象类型使用一个插件,除非您想承担维护自己的自定义项目分支的责任。令人失望。是的,我发现JavaScript中有很多类似的东西。不过,您可能会对此感兴趣:然后是: