Почему к методу Array обращаются через его прототип?

Рейтинг: 1Ответов: 2Опубликовано: 09.09.2014

Заинтересовало меня это потому, что вижу не в первый раз. Сам не уверен в правильности понимания и решил спросить, почему и для чего пишут вот так:

function method(object){
    var array = Array.prototype.slice.call(arguments, 1);
}

Ответы

▲ 2Принят

Этот кусок когда преобразует объект в обычный Array, чтобы для arguments можно было использовать функции прототипа или чтобы функции, принимающие только Array, могли нормально работать. Конкретно эта строчка отбрасывает первый аргумент. Видимо, дальше написано что-то вроде:

 myfunct.apply(this,arguments);

Иногда еще пишут

 [].splice.call(arguments,0);

Это короче, но в таком случае один раз создается лишний объект типа массива, поэтому в циклах лучше использовать Array.prototype.method.call

Методы splice и slice возвращают новый Array, поэтому это часто используется еще и для неглубокого клонирования Array:

var newArray=oldarray.slice();

Вот что пишут об этом в спецификации:

ПРИМЕЧАНИЕ Функция slice является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции slice к объекту среды зависит от реализации.

▲ 2

Если коротко, то это для более уверенного преобразования объектов в тип Array. Или преобразования Object в Array.

Если у вас на вход прилетит такой объект

var my_object = {
    '0': 'zero',
    '1': 'one',
    '2': 'two',
    '3': 'three',
    '4': 'four',
    length: 5
};

то данная функция его преобразует в массив, потому что все атрибуты массива присутствуют. А если использовать my_object.slice(), то браузер может ругнуться.

Если глубже, то когда вы создаёте объект так:

`my_object1 = {}`

то у него родительский прототип Object

А если так:

 my_object1 = []

то Array.

А что бы превратить вручную Object в Array, используют вашу конструкцию.

Вот как-то так.