4

我想用原型扩展标准对象,例如字符串。例如,为 Array添加diff函数。Node.js 中组织代码的好方法是模块,但是如何使用原型呢?

例子

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

3 回答 3

4

我不能说 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希望这样的代码是正确的......我只是在这里快速输入

于 2012-08-08T11:30:41.643 回答
0

这对我有用。

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 ]
于 2012-08-08T11:33:46.837 回答
-2

**由于我的排名较低,我无法发表评论:(所以我正在写一个答案

扩展本机对象是一种非常糟糕的做法,请不惜一切代价避免这种做法。Mootools 采用了这种方法,只需在 Google 上搜索“mootools 碰撞”并查看不断出现的问题。尽管自 1.2.4 版以来他们一直在远离它。

一旦另一个库扩展本机对象(映射,图形库有时根据过去的经验这样做),您就会得到不同的代码,期望这些添加的行为不同。

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

于 2012-08-09T12:38:46.043 回答