2012-08-08 18 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這些補充。

因此,在短期,創造另一個「工具」類,裏面這些功能,包括和使用,來代替。