JS Advance Flashcards
Как и почему отработает данный код?
let user = { name: "Джон", hi() { alert(this.name); } };
let hi = user.hi; hi()
Будет ошибка, потому чтоthis будет потерян при присваивании в hi.
Дело в том, что для работы вызовов типа user.hi(), JavaScript использует трюк – точка ‘.’ возвращает не саму функцию, а специальное значение «ссылочного типа», называемого Reference Type.
Когда скобки () применяются к значению ссылочного типа (происходит вызов), то они получают полную информацию об объекте и его методе, и могут поставить правильный this.
При любой другой операции, например, присваивании hi = user.hi, ссылочный тип заменяется на собственно значение user.hi (функцию), и дальше работа уже идёт только с ней.
Как сделать функцию, которая может быть вызвана как обычным образом, так и через оператор new?
Пример: const a = Number("5") const b = new Number("5") // этот вариант ужасен, не надо так делать!
С помощью new.target
function Number(value) { if (new.target) { ... } else { ... } }