ES6:在不调用构造函数的情况下实例化类

7

有没有办法在不调用构造函数的情况下实例化一个新的类实例?

就像这样:

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,并希望使用实体的构造函数来创建新对象,但不想在实例化已持久化对象的实体时调用它们(那些已经存储在数据库中的实体)。
我知道doctrine(PHP ORM)使用这种方法,但据我所知,他们使用代理类来实现它。在typescript(或一般的ES6 / ES7)中是否有任何简单的方法可以实现这一点?
我已经找到了这个问题ES6: call class constructor without new keyword,它要求相反,并看到一个答案提到Proxy对象。这听起来像是一种可能的方法,但从文档中我并不确定它是否可行。

1
你愿意限制类可以使用的特性吗?如果有人在构造函数中添加了对类对象行为至关重要的逻辑,比如绑定函数或其他操作,该怎么办? - loganfsmyth
这是一个实现问题,我需要它。不确定是否在这里讨论它是正确的,但关键是有时候我需要实例化该类,而我没有任何数据,只有实体ID。如果有构造函数参数(我一定想允许),我不能调用构造函数--我知道我可以使用null来调用它,但是这样会出现传递null的问题,而在那里你需要传递一些东西--可能是对象,当用户使用该对象的属性时,他将在那里获得空指针。 - Martin Adámek
重点是我希望用户只在创建新实体时使用构造函数(而不是在其他地方使用),这是将被记录的内容,所以我认为这很好。 - Martin Adámek
很好。对我来说,这似乎是一个不使用构造函数设置属性的论点,而是保持构造函数简单,并在构造函数外部构建其他逻辑的论点。 - loganfsmyth
1个回答

21
您可以添加一个名为create的静态方法,用来从类原型创建对象。像这样的代码应该可以工作: ```js class MyClass { static create() { return new this(); } }
const obj = MyClass.create(); console.log(obj instanceof MyClass); // true ```

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


哦,天啊,真的这么简单吗?:] - Martin Adámek
1
好的,你要求简单方法...! :) - ZER0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接