Есть ли способ создать экземпляр нового класса без вызова его конструктора?
Что-то вроде этого:
class Test {
constructor(foo) {
this.foo = 'test';
}
}
const a = new Test('bar'); // call constructor
const b = Test.create(); // do not call constructor
console.info(a.foo, a instanceof Test); // bar, true
console.info(b.foo, b instanceof Test); // undefined, true
Я пытаюсь разработать TS mongo ORM и хотел бы использовать конструкторы сущностей для создания новых объектов, но не хочу их вызывать при создании экземпляров сущностей уже сохраненных объектов (тех, которые уже хранятся в БД).
Я знаю, что доктрина (PHP ORM) использует этот подход, но, кстати, они используют прокси-классы для его достижения. Есть ли простой способ добиться этого в машинописном тексте (или вообще в ES6 / ES7)?
Я уже нашел этот вопрос ES6: вызов конструктора класса без нового ключевого слова, который требует обратного, и увидел один ответ, в котором упоминается объект Proxy. Это звучит как возможный путь, но, судя по документации, я не совсем уверен, достижимо ли это.
Что ж, есть проблема реализации, для которой мне это нужно. не уверен, что это подходящее место, чтобы поговорить об этом, но дело в том, что иногда мне нужно создать экземпляр класса, когда у меня нет данных, только идентификатор объекта. и если бы были параметры конструктора (которые я определенно хочу разрешить), я не мог бы вызвать конструктор из-за этого - я знаю, что мог бы вызвать его с помощью null, но тогда возникает проблема с передачей null, когда от вас требуется передать что-то - возможно, объект, и когда пользователь использует свойство этого объекта, он получит там нулевой указатель.
Дело в том, что я хочу, чтобы пользователи использовали конструктор только для создания нового объекта (а не в других местах), это то, что будет задокументировано, поэтому я думаю, что это нормально.
Справедливо. Мне это кажется аргументом в пользу отказа от использования конструктора для установки таких свойств, как вы хотите, и вместо этого сохраните конструктор простым и создайте другую логику вне конструктора.



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


Вы можете добавить метод create static, который создает объект из прототипа класса. Что-то вроде этого должно работать:
class Test {
constructor(foo) {
this.foo = foo;
}
static create() {
return Object.create(this.prototype);
}
}
const a = new Test('bar'); // call constructor
const b = Test.create(); // do not call constructor
console.info(a.foo, a instanceof Test); // bar, true
console.info(b.foo, b instanceof Test); // undefined, true
о боже, это действительно так просто? :]
ну, вы просили простой способ…! :)
Готовы ли вы ограничить возможности, которые разрешено использовать классам? Что, если кто-то добавит в конструктор логику, которая имеет решающее значение для поведения самого объекта класса, например привязку функции или что-то в этом роде?