Ответ 1
Это не удается, потому что ссылки на методы Javascript не содержат ссылки на сам объект. Простой и правильный способ присвоения переменной console.log
переменной, а вызов относится к console
, заключается в использовании метода bind
для метода log
, передающего console
в качестве аргумента:
var log = console.log.bind(console);
Существует скрытый аргумент this
для каждого метода, и из-за плохого дизайна языка он не закрывается, когда вы получаете ссылку на метод. Цель метода bind
состоит в том, чтобы предварительно назначить аргументы функциям и вернуть функцию, которая принимает остальные аргументы, ожидаемые функцией. Первый аргумент bind
всегда должен быть аргументом this
, но вы можете фактически назначить любое количество аргументов, используя его.
Использование bind
имеет значительное преимущество в том, что вы не теряете способность метода принимать больше аргументов. Например, console.log
может фактически принять произвольное количество аргументов, и все они будут объединены в одну строку журнала.
Вот пример использования bind
для переназначения большего количества аргументов на console.log
:
var debugLog = console.log.bind(console, "DEBUG:");
Вызов debugLog
будет префикс сообщения журнала с помощью DEBUG:
.