2016-03-16 49 views
1

正如我們所知,我們可以使用數組原型方法,函數參數就像下面一樣。對非數組使用數組原型函數

function abc() { 
    // As 'arguments' is a array like object which don't have Array prototype functions. 
    Array.prototype.push.call(arguments, 30); 
    console.log(arguments); 
} 
abc(10, 20); // Output is: [10, 20, 30] 

所以像明智的我試圖DOM元素上使用推班級名冊像下面這給了我一個錯誤「無法設置的翻譯:它只有一個getter財產長度」。

var bodyClassList = document.body.classList; 
Array.prototype.push.call(bodyClassList, 'myClass'); 

注:我剛纔想學習的概念所以這就是爲什麼我用推,即使它已經內置的add()方法

所以我的問題是:

在哪些對象,我們可以使用Array.prototype方法呢?

在此先感謝。

+2

原因很明顯,因爲_只有一個getter_。你可以使用'classList.add('myClass')' – Tushar

+0

你好@Tushar,我不明白那個錯誤信息。你能否詳細解釋一下。 – Sivakumar

+0

我們如何檢查像對象這樣的數組是否支持數組原型函數。我的意思是,我們可以使用參數。但對於classList,我們不能。 – Sivakumar

回答

2

Array.prototype方法是相當通用的方法,適用於各種對象。他們只是獲取並設置索引屬性以及它們被調用的對象的.length。 (並且,如果需要創建新實例,則使用ES6,0123,Array實例的屬性)。您可以check the spec查看push究竟做了什麼。

所以基本上,回答你的問題......

在哪些對象,我們可以使用Array.prototype方法呢?

...在所有對象上。也就是說,對象在操作時不會拋出異常。請注意0​​本身不會拋出錯誤。

一些例子:

var x = {0:0, length:1}; 
Array.prototype.push.call(x, 1); 
console.log(x); // {0:0, 1:1, length:2} 
console.log(Array.prototype.slice.call(x)); // [0, 1] 
var y = {0:0, get length() { throw new Error("boo!"); }} 
Array.prototype.push.call(y, 1); // throws 
var z = {get 0() { throw new Error("boo!"); }, length: 1}; 
Array.prototype.push.call(z, 1); 
console.log(z); // {0:…, 1:1, length:2} 
console.log(Array.prototype.slice.call(z)); // throws 

arguments對象非常像xclassList非常像y