修改整个项目的对象原型

时间:2015-03-18 03:20:29

标签: node.js backbone.js browserify commonjs

我在我的项目中使用Browserify,但我认为这个问题也会影响NodeJS的开发。我正在编写一个Backbone / Marionette项目,我想覆盖整个项目的sync方法。例如,我想使用Backbone.dualStorage。

在全球范围内工作时,这对我来说都很有意义。首先使用script标记导入Backbone,然后在覆盖方法旁边导入dualsync脚本。

现在我修改了Backbone.dualStorage以导出一个以Backbone_为输入的函数:

module.exports = function(Backbone, _) {

   // It has some special methods for handling local data
   Backbone.Collection.prototype.syncDirty = function(options) {
   };


   // It stores the original Backbone.sync
   backboneSync = Backbone.DualStorage.originalSync = Backbone.sync;

   // Builds a specy dualsync method
   // Then it overrides it
   Backbone.sync = dualsync;

   // Then my modification was to return the new Backbone object with the
   // prototypes modified...
   return Backbone;
};

我用

导入它
var Backbone = require('backbone');
var _ = require('lodash');
Backbone = require('my-custom-backbone-dualstorage')(Backbone, _);

如果我多次调用require,我会收到一个错误,指出我有堆栈溢出,因为它创建了一个新的dualsync的无限循环调用旧同步,调用dualsync等)。所以现在我不确定我需要require这个模块我需要的时间和地点。这种方法感觉很糟糕。

但我还有其他原因可能要修改其他模块的原型。我可能想完全关闭本地同步:

Backbone.Collection.prototype.local = false;

但是我会在项目的哪个位置这样做?浏览器不保留模块范围的本地声明吗?如何确保在整个项目中进行此更改?对此最好的做法是什么?

1 个答案:

答案 0 :(得分:1)

我不确定你是什么意思没有浏览器保持模块范围的本地声明吗?,Browserify与普通的普通Javascript具有相同的范围概念。如果你的意思是浏览器是否创建了我导入的东西的克隆?那么答案是否定的。 当您require('backbone')在两个不同的模块中时,您仍然可以获得相同的Backbone实例。

为了解决你的插件初始化不止一次的问题,我采取的方法是在我的应用程序主文件中需要所有模块和一次性函数。我有一个文件可以解决所有其他问题,这与我在运行browserify时用作参数的文件相同。

如果您使用

从命令行运行
$ browserify app.js > bundle.js

或使用Grunt

browserify: {
    app: {
        src: ['src/main/app.js'],
        dest: 'app/app.js'
    }
}

或者无论您使用它的哪种方式,只要您确保定位单个文件并让浏览器确定其余文件,然后将您的应用程序范围内的""在该文件中设置,导入Backbone插件,覆盖同步,运行Modernizr或其他任何东西。

如果您已将应用程序拆分为模块,并且您只有在包含某个模块时才想运行插件,那么请将其放入该模块的主文件"代替。