2014-01-17 65 views
0

我在書上找到了代碼,並且遇到了一些問題。關於原型和陣列的一些問題

var elems = {}; 
Array.prototype.push.call(elems, document.getElementById("first")); 
alert(elems[0].nodeType); /It would output 1 
  1. 我知道,「呼」是綁定推法「elems的」對象。但「elems」是一個空的對象,爲什麼空對象具有「push」方法?
  2. 我試圖放棄從Array.prototype.push到Array.push的「原型」。但它沒有 工作。爲什麼?正如我從書中知道的那樣,這個方法可以歸因於原型鏈。 謝謝。
+1

你確定這不是'無功elems的= [];'? – Andy

+1

不,那麼他們可以只做'elems.push'。這段代碼似乎證明了在非'Array'對象上調用'Array'方法的能力。 –

+0

只是因爲你可以這樣做,並不意味着你應該:) – Andy

回答

1

樣品控制檯會話澄清一些事情(閱讀評論):

var elems = {}; 
Array.prototype.push.call(elems, 10); // you're telling 'push' to act like the argument is an array, even if it's not 
// that's what 'call' does 
> 1 // note that 'push' returns the length of the resultant array 
elems 
> Object {0: 10, length: 1} // 'push' is *acting* like 'elems' is an array, when really it's not 
> Array.prototype.push // getting from 'prototype' which is basically all the properties that every Array has 
function push() { [native code] } 
> Array.push // this doesn't exist 
undefined 
> [].push // shows the 'prototype' chain 
function push() { [native code] } 
+0

謝謝,但爲什麼[] .prototype.push dos不起作用? – user2837851

+0

@ user2837851因爲'[]'不具有* prototype屬性。這是'Array'的一個實例。 – Doorknob

2

您的對象沒有推送方法。通過使用.call(),您指示.push()對該對象進行操作,就像它是一個可以工作的數組一樣。

Array.push不起作用(Firefox除外),因爲.push是爲所有Array對象繼承的方法。因此,它存在於Array構造函數的.prototype中。


如果你這樣做:

[].push.call(elems, ...) 

,因爲你正在創建一個新的磁盤陣列,以及通過繼承,它來源於Array.prototype越來越.push()這是可行的。


在Firefox中,你只需要做到這一點:

Array.push(elems, document.getElementById("first")); 

這是因爲Firefox擁有所謂的「陣列仿製藥」,其中接受該對象作爲第一個操作參數,以及作爲第二個(或更多)推動的項目。