为整个项目修改一个对象的原型

Modifying the prototype of an object for the entire project

我正在为我的项目使用 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 ,我会收到一条错误消息,指出我有堆栈溢出,因为它创建了一个无限循环的新双同步调用旧同步,旧同步调用双同步等)。所以现在我不确定何时何地需要 require 我制作的这个模块。这种方法感觉很老套。

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

Backbone.Collection.prototype.local = false;

但是我应该在项目的什么地方做这个? browserify 不会将声明保留在模块范围内吗?我如何确保在整个项目中进行此更改?这方面的最佳做法是什么?

我不确定你说的是什么意思 browserify 不保留模块作用域的局部声明吗?,Browserify 具有与普通纯文本相同的作用域概念 Javascript.如果您的意思是 browserify 会创建我导入的东西的克隆吗? 那么答案是否定的。 当您在两个不同的模块中 require('backbone') 时,您仍然会得到 Backbone.

的相同实例

为了解决多次初始化插件的问题,我采用的方法是在我的应用程序主文件中要求我需要的所有模块和一次性函数。我有一个文件可以启动其他所有功能,这与我在 运行ning browserify.

时用作参数的文件相同

如果您运行从命令行使用

$ browserify app.js > bundle.js

或使用 G运行t 和

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

或者无论您使用哪种方式,只要您确保以单个文件为目标并让 browserify 找出其余部分,然后将您的 "application-wide" 设置放入该文件中,无论是导入 Backbone 插件、覆盖同步、运行ning Modernizr 或其他任何东西。

如果您已将应用程序拆分为多个模块,并且您的插件只需要 运行 如果包含某个模块,则将其放入该模块的 "main file" 中。