TS / ES6:不调用构造函数实例化类

时间:2018-06-14 11:21:17

标签: javascript node.js typescript ecmascript-6 es6-class

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

这样的事情:

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中的对象)的实体时不想调用它们。

我知道doctrine(PHP ORM)使用这种方法,但是他们使用代理类来实现它。有没有简单的方法来实现打字稿(或通常在ES6 / ES7中)?

我已经找到了这个问题ES6: call class constructor without new keyword,要求相反,并看到一个答案提到Proxy对象。这听起来像是一种可行的方式,但从文档中我不确定它是否可以实现。

1 个答案:

答案 0 :(得分:4)

您可以添加一个static方法create,它从类原型中创建一个Object。这样的事情应该有效:

class Test {
  constructor(foo) {
    this.foo = 'test';
  }
  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, a instanceof Test); // undefined, true