【发布时间】:2022-05-11 14:28:20
【问题描述】:
有什么方法可以在不调用构造函数的情况下实例化新的类实例?
类似这样的:
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,并且想使用实体的构造函数来创建新对象,但不想在实例化已经持久化的对象(那些已经存储在 DB 中的对象)的实体时调用它们。
我知道学说(PHP ORM)使用这种方法,但是他们正在使用代理类来实现它。有没有什么简单的方法可以在打字稿中(或通常在 ES6/ES7 中)实现这一点?
我已经找到了这个问题ES6: call class constructor without new keyword,它要求相反,并且看到一个答案提到了Proxy 对象。这听起来像是一种可能的方式,但从文档中我不确定它是否可以实现。
【问题讨论】:
-
你愿意限制类允许使用的特性吗?如果有人在构造函数中添加了对类对象本身的行为至关重要的逻辑,比如绑定一个函数或其他什么?
-
嗯,我需要这个实现问题。不确定这是否是谈论它的正确地方,但关键是有时我需要在没有任何数据时实例化类,只有实体 ID。如果有构造函数参数(我绝对希望允许),我不能因此调用构造函数——我知道我可以用 null 调用它,但是在你需要传递 null 的地方存在问题传递一些东西——可能是对象,当用户使用该对象的属性时,他会在那里得到一个空指针。
-
重点是我希望用户使用构造函数只是为了创建新实体(而不是在其他地方),这将被记录下来,所以我认为它很好。
-
很公平。对我来说,这似乎是不使用构造函数来设置你想要的属性的论据,而是保持构造函数简单并在构造函数之外构建其他逻辑。
标签: javascript ecmascript-6 es6-class