一种方法是使用包装对象,如 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
函数只定义一次。
这一切都取决于你需要/想要什么。