2016-03-27 73 views
0

我有動態地擴展給定的配置對象,像這樣的基ES6類:引用從實例方法靜態成員上動態擴展JS

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()方法,我d喜歡引用靜態對象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類的靜態成員。

我在控制檯的原型測試不足嗎?或者是否有任何其他方式從一個繼承的方法訪問實例方法中的構造函數類?

回答

0

在我的測試中,我得出結論認爲Y.prototype = Object.create(X.prototype);與ES6 extends實現不相當。

在節點REPL運行:

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