TS/ES6: создание экземпляра класса без вызова конструктора

Есть ли способ создать новый экземпляр класса без вызова его конструктора?

Что-то вроде этого:

class Test {
    constructor(foo) {
        this.foo = 'test';
    }
}

const a = new Test('bar'); // call constructor
const b = Test.create();   // do not call constructor
console.log(a.foo, a instanceof Test); // bar, true
console.log(b.foo, b instanceof Test); // undefined, true

Я пытаюсь разработать TS mongo ORM и хотел бы использовать конструкторы сущностей для создания новых объектов, но не хочу вызывать их при создании экземпляров сущностей уже сохраненных объектов (тех, которые уже хранятся в БД).

Я знаю, что доктрина (PHP ORM) использует этот подход, но, на самом деле, они используют прокси-классы для его достижения. Есть ли простой способ добиться этого в машинописном тексте (или вообще в ES6/ES7)?

Я уже нашел этот вопрос ES6: вызов конструктора класса без нового ключевого слова, который требует обратного, и увидел в одном ответе упоминание Proxy объект. Это звучит как возможный путь, но из документов я не совсем уверен, достижимо ли это.


person Martin Adámek    schedule 14.06.2018    source источник
comment
Готовы ли вы ограничить функции, которые разрешено использовать классам? Что, если кто-то добавит в конструктор логику, критическую для поведения самого объекта класса, например привязку функции или что-то в этом роде?   -  person loganfsmyth    schedule 14.06.2018
comment
хорошо, есть проблема с реализацией, для которой мне это нужно. не уверен, что это правильное место, чтобы говорить об этом, но дело в том, что иногда мне нужно создать экземпляр класса, когда у меня нет никаких данных, только идентификатор объекта. и если бы были параметры конструктора (которые я определенно хочу разрешить), я не мог бы вызвать конструктор из-за этого - я знаю, что мог бы вызвать его с нулевым значением, но тогда возникает проблема с передачей нулевого значения, где вы должны передать что-то -- возможно, объект, и когда пользователь использует свойство этого объекта, он получит там нулевой указатель.   -  person Martin Adámek    schedule 14.06.2018
comment
дело в том, что я хочу, чтобы пользователи использовали конструктор только для создания нового объекта (а не в других местах), это то, что будет задокументировано, поэтому я думаю, что это нормально.   -  person Martin Adámek    schedule 14.06.2018
comment
Справедливо. Мне это кажется аргументом в пользу того, чтобы не использовать конструктор для установки свойств, как вы хотите, а вместо этого сохранить конструктор простым и построить другую логику вне конструктора.   -  person loganfsmyth    schedule 14.06.2018


Ответы (1)


Вы можете добавить метод 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.log(a.foo, a instanceof Test); // bar, true
console.log(b.foo, b instanceof Test); // undefined, true
person ZER0    schedule 14.06.2018
comment
о господи, неужели все так просто? :] - person Martin Adámek; 14.06.2018
comment
ну, вы просили простой способ…! :) - person ZER0; 14.06.2018