Задать вопрос
@Romario5891

Стрелочная функция и контекст?

Всем привет. Объясните простыми словами почему в примере ниже при использовании стрелочной функции не теряется контекст? В моем понимании стрелочная функция берет контекст при объявлении, а не при вызове как в обычных функциях. Почему сохранение контекста происходит именно в функциях конструкторах?
class Car{
    constructor() {
        this.name = "BMW"
    }
    showname = () => {
        console.log(this.name);
    }
}
let car = new Car();
car.showname();
  • Вопрос задан
  • 341 просмотр
Подписаться 2 Простой 13 комментариев
Пригласить эксперта
Ответы на вопрос 2
Aetae
@Aetae Куратор тега JavaScript
Тлен
В моем понимании стрелочная функция берет контекст при объявлении

Не совсем при объявлении, скорее при создании.(хотя это одно и тоже, но так меньше непонимания, имхо)
Соответственно при создании нового экземпляра класса объявляется(создаётся) новая стрелочная функция в контексте этого экземпляра. По сути это просто свойство, уникальное для каждого экземпляра, в отличие от метода, который один для всех.

class Car{
    constructor() {
        this.name = "BMW"
    }
    showname = () => {
        console.log(this.name);
    }
}
let { showname } = new Car();
let obj = {
  name: 'random',
  showname
}
obj.showname() // всё равно BMW


Вообще все свойства в классе объявляются(создаются) в контексте экземпляра:
class Car {
    storedThis = this
}
const car = new Car();
const { storedThis } = car;
car === storedThis; // true

После же того как они были созданы они живут обычной жизнью.
Ответ написан
Комментировать
miraage
@miraage
Старый прогер
Это babel-plugin-proposal-class-properties.
Дописывает свойства в конструктор.

class Foo {
  foo = 5;
  
  bar = () => {
  	console.log(this.foo); 
  };
}


// вспомогательные функции вырезаны из ответа для упрощения
var Foo = function Foo() {
  var _this = this;

  _classCallCheck(this, Foo);

  _defineProperty(this, "bar", function () {
    console.log(_this.foo);
  });

  this.foo = 5;
};
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы