JavaScript 📜
January 25, 2021

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]]".

Результат будет выглядеть так:

https://prnt.sc/xn36o7

На изображении: "prototype" – горизонтальная стрелка, обозначающая обычное свойство для "F", а [[Prototype]] – вертикальная, обозначающая наследование rabbit от animal.

https://prnt.sc/xn36o7