【问题标题】:ES6: Instantiate class without calling constructorES6:实例化类而不调用构造函数
【发布时间】: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


【解决方案1】:

您可以添加一个static 方法create,从类原型创建一个对象。类似的东西应该可以工作:

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

【讨论】:

  • 天哪,真的那么简单吗? :]
  • 好吧,你要求一个简单的方法......! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-16
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 2011-03-07
相关资源
最近更新 更多