от
Я читал исходный код ki.js и наткнулся на странное использование функции call () (см.
function i(a)
на GitHub). Сначала я упростил функцию
i(a)
для моих целей, теперь функция выглядит так:
function ki(selector, arr) {
    document.querySelectorAll(selector).forEach((el) => { arr.push.call(this, el); }); 
}
Когда я вызываю свою функцию следующим образом:
new ki(".test", []);
, я получаю ожидаемый результат - объект с объектами DOM и свойством прототипа, скопированным из прототипа функции ki (). Но когда я просто слегка изменяю функцию ki () на это: (удаляя, на мой взгляд, ненужную функцию call ()):
function ki(selector, arr) {
    document.querySelectorAll(selector).forEach((el) => { arr.push(el); }); 
}
Выполнение
new ki(".test", []);
приведет к созданию объекта без каких-либо объектов DOM, только со свойством прототипа, унаследованным конструктором. Это то, что я не понимаю. Почему необходимо манипулировать исходным кодом array.prototype.push () (заменив
this
на
this
в другом контексте)? Кроме того, этот код также будет работать при использовании в строгом режиме? Спасибо за любую помощь.              

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

2 Ответы

0 голосов
от
Если функция ki используется в качестве конструктора, то объекты el передаются не в массив arr, а в значение this, которое будет созданным объектом.
arr =  new Array
arr2 =  new Array

document.querySelectorAll('a').forEach((el) =
0 голосов
от
Первый
arr.push(el)
также может быть записан как
arr.push.call(arr, el)
. выглядит знакомо? Но
this
! ==
arr
в вашем коде. В этом коде
arr.push.call(...)
используется как сокращение для
Array.prototype.push.call(...)
. Еще один распространенный способ написания этого -
[].push.call(...)
. Sidenote: подождите, пока не дойдете до кода, подобного Function.prototype.apply.call (...)     
Добро пожаловать на сайт ByNets, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...