如何在Node.js中使用模块等原型?

我想用原型来扩展标准对象,例如String。 例如,为数组添加diff函数。 在Node.js中组织代码的好方法是模块,但是如何在prototype中做到这一点?

Array.prototype.diff = function (a) { return this.filter(function (i) { return !(a.indexOf(i) > -1); }); }; 

我不能说nodejs,但Mozilla的JS模块是相似的,我想我遇到同样的问题一次。

事情是,每个JS模块(和nodejs模块也可能)运行在自己的JavaScript上下文中,因此不同模块的数组构造函数(和原型)是不一样的。 他们是完全不同的对象。

我可能会有一个辅助函数的模块,将相应的更改添加到给定的对象。 这意味着你必须从你想要使用扩展数组原型的每个模块中调用帮助函数。

ArrayHelperModule:

 function extendArray(arrayConstructor) { arrayConstructor.prototype.diff = function (a) { return this.filter(function (i) { return !(a.indexOf(i) > -1); }); }; } exports.extendArray = extendArray; 

使用Array的模块:

 var ArrayHelperModule = require("ArrayHelperModule"); // extending the Array of this module ArrayHelperModule.extendArray(Array); // use it var diff = [1, 2].diff([1]); 

ps希望代码是正确的这种方式…我只是在这里input在这里很快

这对我有效。

 Array.prototype.diff = function( compareArray ) { return this.filter( function( arrayItem ){ return this.indexOf( arrayItem ) == -1; }, compareArray ); }; 

你也可以给原型链添加一个关卡,但是这需要更多的复杂性,而且看起来并没有什么用处。

Ps我不知道你打算如何使用过滤function。

 var a = [1,2,3,4]; var b = [3,4,5,6]; console.log( a.diff( b ) ); // Outputs: [ 1, 2 ] 

**由于我的排名低,我不能评论:(所以我正在写一个答案

扩展本地对象是一个非常糟糕的做法,请不惜一切代价避免这种情况。 Mootools已经采取了这种方法,只是谷歌“摩托车碰撞”,并看到不断提出的问题..即使他们已经离开它从版本1.2.4。

一旦另一个库扩展本地对象(映射,graphics库有时从过去的经验做到这一点),你会得到不同的代码,期望在这些添加中不同的行为。

所以简而言之,创build另一个“实用程序”类,包含这些function,并包含和使用它。