How to make an Array-Like Object in Javascript

我這裡所說的Array-Like Object是指那種可以在終端中打印成Array樣式的Object,比如在Firebug中打印

console.log(['javascript', 'ruby', 'python']);
你會看到這樣的結果

類似的還有arguments/NodeList等都可以這樣,較早版本的jQuery也是這樣,不過最近的版本改了。
你可以試試

console.log(document.querySelectorAll('div'));
console.log((function(){return arguments;})('javascript', 'ruby', 'python'));
結果應該是類似的。如果我們要是自己寫一個類,有length和對應下標的數據,那麽打印出來會怎樣呢?
function Foo() {
    this.length = 1;
    this[0] = 'javascript';
    this[1] = 'python';
    this[2] = 'ruby';
}
console.log(new Foo());
打印出來就和Array很不像

要怎樣才行呢?其實蠻簡單,只要加入這樣一行就可以了。

Foo.prototype.splice = Array.prototype.splice;
當然,要是想寫一個更像Array的Object,還有更絕的哦
function Foo() {
    this.length = 0;
}
Foo.prototype = Array.prototype;
Foo.prototype.constructor = Foo;
這樣你的Foo就和Array幾乎一樣了,不過這樣也有不好


  • 一方面對Array的prototype有修改,雖然我还没發現會造成什麽問題,但感覺還是不太好;
  • 另一方面如果你再給Foo.prototype添加更多的方法的時候,就會連同Array.prototype也受影響,這樣一定是有問題的,比如forin的loop中會把Array中的函數也迭代到了。
所以建議用到Array的哪些函數就取哪些,不要直接把prototype給搶過來,那樣太暴力了。


完。

你可能感兴趣的:(How to make an Array-Like Object in Javascript)