Работа method borrowing в JS

Влад Жадченко

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

Это называется «одалживание метода» (на англ. method borrowing).

Вопрос: В примере ниже демонстрируется method borrowing. Но где здесь работа метода call()? Ведь в коде демонстрируется изменение контекста вызова this, который находится внутри метода join().

PS: или же когда мы говорим call, мы не имеем ввиду способ изменения контекста за счёт вызова obj.call(), а просто имеем ввиду умышленное изменение контекста вызова ф-ции с this?

function printArgs() {
arguments.join = [].join; // одолжили метод (1)

var argStr = arguments.join(':'); // (2)

alert( argStr ); // сработает и выведет 1:2:3
}

printArgs(1, 2, 3);
1 ответ

Влад Жадченко

Ответ найден: действительно, в данном примере метод call() при methoв borrowing не играет. Но в примере выше приведён способ опасного использования MB, в результате которого у объекта arguments мог быть перезаписан собственный join()(если бы он у него был). Безопасное использование MB предполагает использование метода call(), как в примере ниже:

function printArgs() {
var join = [].join; // скопируем ссылку на функцию в переменную

// вызовем join с this=arguments,
// этот вызов эквивалентен arguments.join(':') из примера выше
var argStr = join.call(arguments, ':');

alert( argStr ); // сработает и выведет 1:2:3
}

printArgs(1, 2, 3);

licensed under cc by-sa 3.0 with attribution.