Вы должны задать себе один вопрос: что такое class
на самом деле?
На самом деле это всего лишь синтаксис для составления следующих вещей:
1) A constructor
. Это какая-то функция, которая создает экземпляр класса.
2) методы. Их можно назвать на экземплярах.
Теперь для второго, JS уже имеет отличную возможность для достижения этой цели: наследование прототипа. Объекты могут наследовать другие объекты, включая методы:
const proto = { method() { /*...*/ } };
const instance = Object.create(proto);
instance.method(); // that works, as instance inherits proto
Теперь нам нужны только конструкторы, для этого мы могли бы просто вызвать функцию после того, как создали объект, используя метод, описанный выше:
constructInstance(Object.create(proto));
Теперь, поскольку это довольно распространенная задача (поскольку JS с самого начала наследует прототипы), был добавлен оператор new
, который в основном делает все это:
1) Создает пустой объект, наследующий от .prototype
вызываемой функции.
2) Вызывает саму функцию с this
, являющимся объектом.
3) Возвращает этот объект.
function Person(name) {
this.name = name;
}
Person.prototype.method = function() { /*...*/ };
new Person("Jonas").method();
И все, наследование и конструкторы без class
es.
Теперь, когда это все еще не так красиво, был добавлен синтаксис class
, который просто создает функцию с прототипом.