在动态扩展的JS类上引用实例方法的静态成员

时间:2016-03-27 18:15:13

标签: javascript class oop inheritance static-members

我有一个基础ES6类,我在给定配置对象的情况下动态扩展,如下所示:

class Model {
  constructor () {
    // ...
  }

  save () {
    // ...
  }
}

function createModelFromConfig (config) {
  const Impl = class extends Model {};
  Object.assign(Impl, config);
  return Impl;
}

const User = createModelFromConfig({store: new DbStore()});

在抽象模型的save()方法中,我想引用静态对象store,它将存在于扩展Model的类中。当然,这意味着我需要引用静态成员,但扩展类是匿名的。

使用Chrome控制台进行快速测试后,我尝试了

function X () {}
X.prototype.doSomething = function () { console.log(this.constructor); };
function Y () {}
Y.prototype = Object.create(X.prototype);
new Y().doSomething(); // function X () {}

我不知道这是否是一个可靠的测试,但似乎this.constructor没有引用我扩展的Impl,而是引用原始的基类,这没有帮助。

一种不太优雅的方法是添加Impl.prototype.Impl = Impl;,这样我就可以在我的保存函数中使用this.Impl.store,但如果没有这个,我可以访问Impl类的静态成员。 / p>

我在控制台中的原型测试是否不合适?或者是否有其他方法可以从继承的方法访问实例方法中的构造函数?

1 个答案:

答案 0 :(得分:0)

在我的测试中,我得出的结论是Y.prototype = Object.create(X.prototype);与ES6 extends实施不够等效。

在Node REPL中运行:

class X {
  constructor () {}
  save () { console.log(this.constructor.z); }
}
class Y extends X {}
Y.z = 'z';
new Y().save(); // 'z'