JS Advance Flashcards

1
Q

Как и почему отработает данный код?

let user = {
  name: "Джон",
  hi() { alert(this.name); }
};
let hi = user.hi;
hi()
A

Будет ошибка, потому чтоthis будет потерян при присваивании в hi.

Дело в том, что для работы вызовов типа user.hi(), JavaScript использует трюк – точка ‘.’ возвращает не саму функцию, а специальное значение «ссылочного типа», называемого Reference Type.

Когда скобки () применяются к значению ссылочного типа (происходит вызов), то они получают полную информацию об объекте и его методе, и могут поставить правильный this.

При любой другой операции, например, присваивании hi = user.hi, ссылочный тип заменяется на собственно значение user.hi (функцию), и дальше работа уже идёт только с ней.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Как сделать функцию, которая может быть вызвана как обычным образом, так и через оператор new?

Пример:
const a = Number("5")
const b = new Number("5") // этот вариант ужасен, не надо так делать!
A

С помощью new.target

function Number(value) {
     if (new.target) { ... }
     else { ... }
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly