2011-05-03 38 views
4

要將size()方法添加到Array對象我這樣做:如何將「size」屬性添加到Javascript Array?

if (!Array.size) { 
    Array.prototype.size = function() { 
     return this.length; 
    }; 
} 

有沒有一種簡單的方法來定義size財產,將工作就像length

(我並不真的需要它,我只是想知道,如果這東西在Javascript中很容易實現。)

回答

8

ES5這是可能的。添加在Array原型size財產,

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] 

它基本上可以作爲圍繞長度的包裝。看起來像一個肉眼看來的財產,但有一個潛在的功能支持。

感謝@ Matthew的評論,這size屬性就像一個完整的長度包裝。

+0

+1很酷 – alex 2011-05-03 02:16:34

+2

你也可以添加一個改變'this.length'的setter。 – 2011-05-03 02:17:37

+0

@Matthew - 這是一個好主意,我只是想保持這個例子最小化。 – Anurag 2011-05-03 02:18:25

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

非常優雅!謝謝! – 2011-05-03 02:46:21