2016-03-27 1 views
0

JS étendu dynamiquement j'ai une classe ES6 de base que je transmets donné dynamiquement un objet de configuration, comme ceci:Référencer membres statiques de méthode d'instance sur la classe

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

    save() { 
    // ... 
    } 
} 

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

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

Dans la méthode save() sur le modèle abstrait, je d aiment faire référence à l'objet statique store, qui existera sur la classe qui étend Model. Cela signifie, bien sûr, que j'ai besoin de référencer un membre statique mais que la classe étendue est anonyme.

Juste un test rapide en utilisant la console Chrome, j'ai essayé

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

Je ne sais pas si cela est un test fiable, mais il semble que this.constructor ne fait pas référence à la Impl que j'étendu, mais au lieu de la classe de base d'origine, ce qui n'est pas utile.

Un moyen moins élégant est d'ajouter Impl.prototype.Impl = Impl; afin que je puisse utiliser this.Impl.store dans ma fonction de sauvegarde, mais il serait préférable si je pouvais accéder aux membres statiques de la classe Impl sans cela.

Mon test prototypique dans la console est-il inadéquat? Ou existe-t-il un autre moyen d'accéder à la classe constructeur dans une méthode d'instance à partir d'une méthode héritée?

Répondre

0

Dans mes tests, j'ai conclu que Y.prototype = Object.create(X.prototype); n'est pas un équivalent adéquat à l'implémentation ES6 extends.

En cours d'exécution dans le nœud REPL:

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