Синтаксис архитектуры плагинов jQuery - что означает эта строка? - PullRequest
0 голосов
/ 30 декабря 2011

Я читал документацию по jQuery для разработки плагинов, и наткнулся на строку кода, которую я не могу обернуть.

  $.fn.tooltip = function( method ) {

if ( methods[method] ) {
  return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
} else if ( typeof method === 'object' || ! method ) {
  return methods.init.apply( this, arguments );
} else {
  $.error( 'Method ' +  method + ' does not exist on jQuery.tooltip' );
}    

Строка, о которой идет речь:

return methods[method].apply(this, Array.prototype.slice.call(arguments,1));

Я понимаю, что все объекты javascript наследуют call () и apply (), и я понимаю разницу между этими двумя функциями. Что я не понимаю, так это прототип на массиве. Объекты Array уже имеют функцию slice (), так зачем здесь нужен прототип? Поскольку call () принимает два аргумента: this (контекст) и список аргументов, я не понимаю, как работает приведенный выше вызов. Может кто-нибудь помочь мне понять эту строчку?

Спасибо

Ответы [ 2 ]

1 голос
/ 30 декабря 2011

Проще говоря, функция Array.prototype.slice выглядит следующим образом:

Array.prototype.slice = function(from) {
    return elements of `this` from index `from`;
};

, поэтому при выполнении Array.prototype.slice.call(obj, a) вы получите obj с элементами только из индекса a.

Проблема в том, что он доступен только для массивов, но вы можете заставить его работать и над объектами, используя описанный вами синтаксис:

var obj = { length: 3,   0: 'a',   1: 'b',   2: 'c' };
Array.prototype.slice.call(obj, 1); // { length: 2,   0: 'b',   1: 'c' }

То же самое относится и к аргументам - это не такt массив, поэтому вам нужно получить доступ к функции с помощью Array.prototype.slice.call.

По сути, единственное, что массивы отличаются от аргументов, это то, что массивы наследуются от Array.prototype, так что вы можете вызывать arr.slice()непосредственно.

1 голос
/ 30 декабря 2011

Объект arguments наследуется от Object.prototype.Это может выглядеть как массив, но это не так.Для выполнения над ним массива необходима следующая строка:

Array.prototype.slice.call(arguments,1)

Предыдущая строка копирует arguments «массив» и использует для него метод slice(1).

Array.prototype.slice(arguments, 1) эквивалентно:

  • Преобразование arguments в истинный массив (путем установки аргументов this Array.slice` в аргументы)
  • Использование метода .slice(1)вернуть массив, который не содержит первый элемент.

(обратите внимание, что объект arguments не изменяется во время этого процесса)

Pseudo-код:

var arguments = {1: "arg1", 2: "arg2", 3: "arg3", length: 3};
var copy = convert_object_to_array(arguments); //This function does not exists
// copy looks like: ["arg1", "arg2", "arg3"]
copy.slice(1); //Returns ["arg2", "arg3"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...