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.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. Это звучит как возможный путь, но, судя по документации, я не совсем уверен, достижимо ли это.

Готовы ли вы ограничить возможности, которые разрешено использовать классам? Что, если кто-то добавит в конструктор логику, которая имеет решающее значение для поведения самого объекта класса, например привязку функции или что-то в этом роде?

loganfsmyth 14.06.2018 16:29

Что ж, есть проблема реализации, для которой мне это нужно. не уверен, что это подходящее место, чтобы поговорить об этом, но дело в том, что иногда мне нужно создать экземпляр класса, когда у меня нет данных, только идентификатор объекта. и если бы были параметры конструктора (которые я определенно хочу разрешить), я не мог бы вызвать конструктор из-за этого - я знаю, что мог бы вызвать его с помощью null, но тогда возникает проблема с передачей null, когда от вас требуется передать что-то - возможно, объект, и когда пользователь использует свойство этого объекта, он получит там нулевой указатель.

Martin Adámek 14.06.2018 16:37

Дело в том, что я хочу, чтобы пользователи использовали конструктор только для создания нового объекта (а не в других местах), это то, что будет задокументировано, поэтому я думаю, что это нормально.

Martin Adámek 14.06.2018 16:44

Справедливо. Мне это кажется аргументом в пользу отказа от использования конструктора для установки таких свойств, как вы хотите, и вместо этого сохраните конструктор простым и создайте другую логику вне конструктора.

loganfsmyth 14.06.2018 18:20
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
3 961
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.info(a.foo, a instanceof Test); // bar, true
console.info(b.foo, b instanceof Test); // undefined, true

о боже, это действительно так просто? :]

Martin Adámek 14.06.2018 13:26

ну, вы просили простой способ…! :)

ZER0 14.06.2018 13:42

Другие вопросы по теме