2011-05-03 4 views

답변

8

ES5으로 가능합니다. 의 Array 프로토 타입에 그것은 기본적으로 길이 래퍼로 작동

Object.defineProperty(Array.prototype, "size", { 
    get: function() { 
     return this.length; 
    }, 
    set: function(newLength) { 
     this.length = newLength; 
    } 
}); 

var x = [1, 2, 3]; 
x.length // 3 
x.size  // 3 

x.push(4); 
x   // [1, 2, 3, 4] 
x.length // 4 
x.size  // 4 

x.length = 2; 
x   // [1, 2] 
x.size = 1; 
x   // [1] 

size 속성을 추가합니다. 육안으로 볼 수있는 속성처럼 보이지만 근본적인 기능이 뒷받침됩니다.

@ Matthew 덕분에이 size 속성은 길이에 대한 완전한 래퍼처럼 작동합니다.

+0

멋진 +1 – alex

+2

'this.length'도 변경하는 세터를 추가 할 수 있습니다. –

+0

@Matthew - 좋은 생각인데,이 예제를 최소화하고 싶었습니다. – Anurag

1

난 당신이 이미이 실제 삶의 문제가 아니라는 것을 알고 가정합니다.

length 속성은 배열의 크기에 맞게 수정되고 shift()pop()과 같은 방법으로 반영됩니다.

따라서 length 속성을 가져 오는 방법이 필요합니다.

Anurag shows you how it can be done (ES5 포함)

1
if(!Array.size) 
{ 
    Array.prototype.__defineGetter__('size', function(){ 
     return this.length; 
    }); 
} 

var a = new Array(); 
a.push(1); 
a.push(4); 

console.log(a.size); 

크로스 브라우저가 얼마나 친숙한 지 잘 모르겠지만 (적어도 Chrome과 FF에서 작동해야 함).

+0

매우 우아합니다! 감사! –

관련 문제