JavaScript Особенности (точности)
Потеря This
При передаче методов объекта в качестве колбэков, например для setTimeout
, возникает известная проблема – потеря this
.
let user = {
firstName: "Вася",
sayHi() {
alert(Привет, ${this.firstName}!
);
}
};
setTimeout(user.sayHi, 1000); // Привет, undefined!
При запуске этого кода мы видим, что вызов this.firstName
возвращает не «Вася», а undefined
!
Это произошло потому, что setTimeout
получил функцию sayHi
отдельно от объекта user
(именно здесь функция и потеряла контекст). То есть последняя строка может быть переписана как:
let f = user.sayHi; setTimeout(f, 1000); // контекст user потеряли
F.prototype
Как мы помним, новые объекты могут быть созданы с помощью функции-конструктора new F()
.
Если в F.prototype
содержится объект, оператор new
устанавливает его в качестве [[Prototype]]
для нового объекта.
Обратите внимание, что F.prototype
означает обычное свойство с именем "prototype"
для F
. Это ещё не «прототип объекта», а обычное свойство F
с таким именем.
Приведём пример:
let animal = { eats: true };
function Rabbit(name) { this.name = name; }
Rabbit.prototype = animal;
let rabbit = new Rabbit("White Rabbit"); // rabbit._proto_ == animal
alert( rabbit.eats ); // true
Установка Rabbit.prototype = animal
буквально говорит интерпретатору следующее: "При создании объекта через new Rabbit()
запиши ему animal
в [[Prototype]]
".
Результат будет выглядеть так:
На изображении: "prototype"
– горизонтальная стрелка, обозначающая обычное свойство для "F"
, а [[Prototype]]
– вертикальная, обозначающая наследование rabbit
от animal
.
https://prnt.sc/xn36o7