我想用原型扩展标准对象,例如String。例如,为Array添加 diff 函数。 Node.js中组织代码的好方法是模块,但是如何使用原型?
实施例
Array.prototype.diff = function (a) {
return this.filter(function (i) {
return !(a.indexOf(i) > -1);
});
};
答案 0 :(得分: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。希望代码以这种方式正确...我只是在这里快速输入
答案 1 :(得分: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 ]
答案 2 :(得分:-1)
**由于我的排名很低,我无法评论:(所以我正在写一个答案
扩展本机对象是一种非常糟糕的做法,请不惜一切代价避免这种情况。 Mootools采取了这种方法,只是谷歌“mootools碰撞”,并看到不断出现的问题..即使他们已经从1.2.4版本开始远离它。
一旦另一个库扩展了本机对象(映射,图形库有时会从过去的经验中做到这一点),您会得到不同的代码,期望这些添加中的行为不同。
简而言之,创建另一个包含这些功能的“实用程序”类,并包含和使用它。