我想用原型扩展标准对象,例如字符串。例如,为 Array添加diff函数。Node.js 中组织代码的好方法是模块,但是如何使用原型呢?
例子
Array.prototype.diff = function (a) {
return this.filter(function (i) {
return !(a.indexOf(i) > -1);
});
};
我想用原型扩展标准对象,例如字符串。例如,为 Array添加diff函数。Node.js 中组织代码的好方法是模块,但是如何使用原型呢?
例子
Array.prototype.diff = function (a) {
return this.filter(function (i) {
return !(a.indexOf(i) > -1);
});
};
我不能说 nodejs,但我猜 Mozilla 的 JS 模块是相似的,我曾经遇到过同样的问题。
问题是每个 JS 模块(可能还有 nodejs 模块)都在自己的 JavaScript 上下文中运行,因此来自不同模块的 Array 构造函数(和原型)是不一样的。它们是完全不同的对象。
我可能会有一个带有辅助函数的模块,该函数将相应的更改添加到给定的对象。但是,这意味着您必须从要从中使用扩展 Array 原型的每个模块中调用辅助函数。
ArrayHelper 模块:
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]);
ps希望这样的代码是正确的......我只是在这里快速输入
这对我有用。
Array.prototype.diff = function( compareArray ) {
return this.filter(
function( arrayItem ){
return this.indexOf( arrayItem ) == -1;
},
compareArray
);
};
我猜你也可以向原型链添加一个级别,但这需要更多的复杂性,而且似乎还没有那么有用。
Ps 我不确定您打算如何使用过滤器功能。
var a = [1,2,3,4];
var b = [3,4,5,6];
console.log( a.diff( b ) );
// Outputs:
[ 1, 2 ]
**由于我的排名较低,我无法发表评论:(所以我正在写一个答案
扩展本机对象是一种非常糟糕的做法,请不惜一切代价避免这种做法。Mootools 采用了这种方法,只需在 Google 上搜索“mootools 碰撞”并查看不断出现的问题。尽管自 1.2.4 版以来他们一直在远离它。
一旦另一个库扩展本机对象(映射,图形库有时根据过去的经验这样做),您就会得到不同的代码,期望这些添加的行为不同。
所以简而言之,创建另一个包含这些功能的“实用程序”类,并包含和使用它。