一種方法是使用包裝對象,如由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
功能只會被定義一次。
這一切都取決於你需要什麼。
1)你的代碼是一個工廠方法,'new'關鍵字對它毫無意義。 2)#1使得使用原型鏈沒有意義。 – Shmiddty 2013-02-13 18:19:21
http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/ – Bergi 2013-02-13 18:27:55
謝謝。但即使沒有它,我也無法將方法放在返回對象的原型上。 – ColBeseder 2013-02-13 18:28:17