ES6 дал более четкое различие между операциями [[Call]]
и [[Construct]]
.Классы ES6 могут быть созданы только с использованием операции [[Construct]]
, но .call
/ .apply
являются операциями [[Call]]
.Чтобы использовать [[Construct]]
, вам нужно будет использовать Reflect.construct()
для создания нового экземпляра.например,
constructor = function () {
return Reflect.construct(Object.getPrototypeOf(constructor), arguments);
};
или
constructor = function () {
return Reflect.construct(currentClass, arguments);
};
Я также отмечу, что это также игнорирует еще одну новую функцию в ES6, которая является new.target
.Вы также захотите сохранить это, выполнив
constructor = function () {
return Reflect.construct(currentClass, arguments, new.target);
};
, чтобы гарантировать, что все будет вести себя так же, как синтаксис класса.
Также обратите внимание, что must не использовать this
внутри этой функции.Это возвращаемое значение Reflect.construct
, которое является новым экземпляром, поэтому, если вы хотите поработать с ним в своем собственном конструкторе, вы, однако, захотите сделать
constructor = function () {
const _this = Reflect.construct(currentClass, arguments, new.target);
_this.foo = "foo";
return _this;
};
, если подумаете оэто, по сути, все то же самое, что и
constructor = class extends currentClass {}