한 가지 방법은 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
http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/ – Bergi
감사합니다. 그러나 그것이 없어도 반환하는 객체의 원형에 메서드를 넣을 수는 없습니다. – ColBeseder