Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение x из объекта, используя функцию
Дан код:
function f() {
console.log(this.x);
}
const obj = {x: 'bar'};
Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение x из объекта, используя функцию.
f.call(obj);f.apply(obj);const bindingF = f.bind(obj); bindingF();obj.f = f; obj.f();obj.__proto__.f = f; obj.f().
Теория по задаче
Рассмотрим разные подходы, позволяющие задать нужный контекст для вызова функции и таким образом обеспечить вывод нужного значения поля объекта.
- Метод
.callМетод.callпозволяет явно задать контекст (this), в котором будет выполнена функция. Аргументы передаются последовательно после указанного контекста.
Пример:
f.call(obj); // Выведет 'bar'
- Метод
.applyМетод.applyпохож на.call, но отличается тем, что аргументы передаются массивом. Для данной задачи, поскольку аргументов нет, разница минимальна.
Пример:
f.apply(obj); // Выведет 'bar'
- Метод
.bindМетод.bindсоздает новую функцию, жестко привязывая указанный контекст к ней. Новый вызов функции выполняется именно в указанном контексте.
Пример:
var boundF = f.bind(obj);
boundF(); // Выведет 'bar'
- Прямой вызов через точку (если функция является методом объекта)
Можно добавить функцию непосредственно в объект и вызвать её через точечную нотацию, тогда
thisбудет правильно установлен в объект.
Пример:
obj.f = f;
obj.f(); // Выведет 'bar'
delete obj.f; // Удаляем свойство после использования
- Изменение прототипа объекта
Добавляем функцию в прототип объекта, тогда она будет доступна как метод объекта
objи выполнится с нужным контекстом.
Пример:
obj.__proto__.f = f;
obj.f(); // Выведет 'bar'
delete obj.__proto__.f; // Убираем метод после использования