Представьте, что мы определяем новый объект следующим образом:
const foo = {number1: 1, number2: 2}
Это должно определить новый «скрытый класс» с этими двумя свойствами.
Теперь представьте, что я определяю новый класс, используя синтаксис класса ES6.
class Numbers {
constructor() {
this.number1 = 1
this.number2 = 2
}
}
и я создаю из него новый объект.
const bar = new Numbers()
Теперь вопрос: будет ли «скрытый класс» bar таким же, как «скрытый класс» foo?
Поскольку я предполагаю, что происходит то, что первое определение создаст новый «скрытый класс» с двумя свойствами, но второе создаст новый «скрытый класс», затем он создаст новый «скрытый класс» с одним свойством, а затем создаст еще один «Скрытый класс» с еще одним свойством, в результате которого три «скрытых класса» связаны вместе.
Кто-нибудь может это прояснить? Если мои предположения верны, то новый «синтаксис класса ES6» действительно медленнее.
По материалам статьи: Основы движка JavaScript: фигуры и встроенные кеши · Матиас Биненс
мое понимание классов es2015 было по существу синтаксическим сахаром над цепочкой прототипов, и у меня сложилось впечатление, что они будут компилироваться в сопоставимые объекты. Я был бы очень рад услышать ответ от кого-нибудь более образованного в этом вопросе.
Некоторые случайные предположения: foo и Numbers будут иметь разные скрытые классы, поскольку их прототип отличается. Кроме того, я предполагаю, что конструктор будет сильно оптимизирован, в результате чего в конце будет использоваться только один скрытый класс, поэтому классы совсем не медленнее по сравнению с функциями конструктора, а разница с литералами объекта очень мала.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Now the question: Is the "Hidden Class" of the bar going to be the same as the Hidden Class of foo?
Нет. foo создаст такой скрытый класс (псевдокод):
{ number1: Number, number2: Number }
Однако конструкция bar создаст три скрытых класса, сначала пустой:
{}
Затем будет назначено первое свойство, которое расширяет существующий скрытый класс:
{ number1: Number } -> {}
После второго задания он снова будет расширен:
{ number2: Number } -> { number1: Number } -> {}
Таким образом, на самом деле скрытый класс не равен скрытому классу foo, поскольку он разделен на несколько скрытых классов, расширяющих друг друга.
If my assumptions are right then the new "ES6 class syntax" is indeed slower.
Наверное. Объектные литералы действительно быстрые, конструкторы классов немного медленнее. На самом деле они даже медленнее, чем обычные функции, но команда V8 работает над этим. Но даже если есть небольшая разница в производительности, вы, вероятно, не заметите ее во многих случаях.
Нет, он говорит об оптимизации движка JS.