2016-03-16 4 views
1

Как мы знаем, мы можем использовать методы прототипа Array с аргументами , как показано ниже.Использование функций прототипа массива с не-массивами

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 элемента ClassList, как показано ниже, что дает мне ошибку «Не удается установить свойство длины [объекта Object], который имеет только геттер».

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

Примечание: Я просто пытался узнать концепции так вот почему я использовал толчок даже имеет встроенный надстройку() метода.

Так что мой вопрос:

На какие объекты мы можем использовать методы Array.prototype?

Заранее спасибо.

+2

Причина в том, что у пользователя есть только геттер_. Вы можете использовать 'classList.add ('myClass')' – Tushar

+0

Привет @Tushar, я не понял этого сообщения об ошибке. Не могли бы вы объяснить подробно. – Sivakumar

+0

Как мы можем проверить, поддерживает ли какой-либо массив, как объекты, функции прототипа Array. Я имею в виду, с аргументами, которые мы можем использовать. Но с classList мы не можем. – Sivakumar

ответ

2

Array.prototype методы - это довольно общие методы, которые работают на всех видах объектов. Они просто получают и устанавливают индексированные свойства и .length объекта, на который они вызывают. (И, с ES6, свойство .constructor экземпляров Array, если им нужно создать новый экземпляр). Вы можете check the spec посмотреть, что делает push.

Так в основном, чтобы ответить на ваш вопрос ...

На какие объекты мы можем использовать методы Array.prototype?

... по всем объектам. То есть объекты, которые не бросают исключения, когда они работают. Обратите внимание, что push сам не выдает ошибку.

Некоторые примеры:

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 очень похож x. classList очень похож на y.

Смежные вопросы