2012-08-08 19 views
4

我想扩展标准的对象,如具有原型的字符串。例如,添加DIFF函数数组。 Node.js中组织代码的好方法是模块,但是如何用prototype实现呢?如何在Node.js中使用模块等原型?

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

回答

4

我不能讲的NodeJS,但Mozilla的JS模块是相似的我想在那里我碰到了同样的问题一次。

的事情是,每个模块JS(和模块的NodeJS大概为好)在其自己的JavaScript上下文中运行,从而来自不同模块的数组构造(和原型)是不一样的。他们是完全不同的对象。

我可能会与添加根据变化给定对象的辅助功能的模块。这意味着您必须从每个要使用扩展Array原型的模块中调用帮助器函数。

ArrayHelperModule:

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

exports.extendArray = extendArray; 

模块使用阵列:

var ArrayHelperModule = require("ArrayHelperModule"); 

// extending the Array of this module 
ArrayHelperModule.extendArray(Array); 

// use it 
var diff = [1, 2].diff([1]); 

P.S.希望该代码是正确的这样......我只是键入它在这里很快

0

这为我工作。

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

你也可以添加一个水平原型链我猜但这需要更多的复杂性似乎并没有多大用处呢。

P.s.我不确定你打算如何使用过滤器功能。

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

// Outputs: 
[ 1, 2 ] 
-1

**由于我的低阶我不能评论:(所以我写一个答案

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

只要另一个库扩展本地对象(映射,图形库有时会从过去的经验中做到这一点),你会得到不同的代码,期待不同的行为f这些补充。

因此,在短期,创造另一个“工具”类,里面这些功能,包括和使用,来代替。