Ответ уже дан, но я просто хочу дать свой кусок пирога. То, чего вы хотите достичь, называется method borrowing
в контексте JS, когда мы берем метод из объекта и вызываем его в контексте другого объекта. Весьма распространено брать методы массива и применять их к аргументам. Позвольте привести пример.
Итак, у нас есть «супер» хеш-функция, которая принимает в качестве аргумента два числа и возвращает «супер-безопасную» хэшированную строку:
function hash() {
return arguments[0]+','+arguments[1];
}
hash(1,2); // "1,2" whoaa
Пока все хорошо, но у нас небольшая проблема с вышеуказанным подходом, он ограничен, работает только с двумя числами, который не является динамическим, давайте сделаем так, чтобы он работал с любым числом, и плюс вам не нужно передавать массив (Вы можете, если вы все еще настаиваете). Хорошо, хватит говорить, давай драться!
Естественным решением будет использование arr.join
метода:
function hash() {
return arguments.join();
}
hash(1,2,4,..); // Error: arguments.join is not a function
О, чувак. К сожалению, это не сработает. Поскольку мы вызываем хеш (аргументы) и аргументы, объект является итеративным и похожим на массив, но не реальным массивом. Как насчет подхода ниже?
function hash() {
return [].join.call(arguments);
}
hash(1,2,3,4); // "1,2,3,4" whoaa
Трюк называется method borrowing.
Мы заимствуем метод join
из обычного массива [].join.
И используем [].join.call
, чтобы запустить его в контексте arguments
.
Почему это работает?
Это потому, что внутренний алгоритм нативного метода arr.join(glue)
очень прост.
Взято из спецификации почти «как есть»:
Let glue be the first argument or, if no arguments, then a comma ",".
Let result be an empty string.
Append this[0] to result.
Append glue and this[1].
Append glue and this[2].
…Do so until this.length items are glued.
Return result.
Итак, технически он берет это и соединяет это [0], это [1] ... и т.д. вместе. Он намеренно написан так, что допускает любой массив, подобный этому (не случайно, многие методы следуют этой практике). Вот почему он также работает с this=arguments.