我有一个基础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>
我在控制台中的原型测试是否不合适?或者是否有其他方法可以从继承的方法访问实例方法中的构造函数?
答案 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'