1 つのアプローチは、Shmiddty による回答のように、ラッパー オブジェクトを使用することです。
または、ラッパーを使用したくないが、配列を直接変更したい場合は、単に拡張することができます:
// Define some special methods for use
var specialMethods = {
sum: function() {
var i = 0, len = this.length, result = 0;
for (i; i < len; i++) result += this[i];
return result;
},
average: function() {
return this.sum() / this.length;
}
};
function specialize(array) {
var key;
for (key in specialMethods) {
if (specialMethods.hasOwnProperty(key)) {
array[key] = specialMethods[key];
}
}
return array;
}
var arr = specialize([1, 2, 3, 4, 5]);
console.log(arr.sum()); // 15
console.log(arr.average()); // 3
この方法では、触れずArray.prototype
に、メソッドを何度も再定義することなく配列に追加できます。ただし、それらは各配列にコピーされるため、メモリのオーバーヘッドが発生することに注意してください。これは、プロトタイプのルックアップを行っているわけではありません。
また、配列を操作する関数をいつでも定義できることに注意してください。
function sum(array) {
var i = 0, len = array.length, result = 0;
for (i; i < len; i++) result += array[i];
return result;
}
の構文シュガーは得られませんsomearray.sum()
が、sum
関数は一度しか定義されていません。
それはすべて、必要なもの/欲しいものに依存します。