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

时间:2012-08-08 10:52:23

标签: javascript node.js

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

实施例

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

3 个答案:

答案 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版本开始远离它。

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

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