2016-07-12 2 views
1

Я хотел бы создать класс ES6 с наследованием из 2 классов (из внешних библиотек), но ES6 этого не позволяет. Я тоже не могу использовать микшины. Imbrication, кажется, мой единственный вариант.Хороший шаблон javascript для объекта imbrication (имитировать множественное наследование)

Для примера предположим, что я хотел бы иметь компонент компонента пользовательского интерфейса, который непосредственно испускает события, материалы журнала и т. Д. (Для полиморфных целей).

Я хотел бы избежать следующей схеме:

class UIComponent extends React.Component { 
    constructor(props) { 
     super(props); 
     this.ee = new EventEmitter(); 
    } 

    /* 
    * methods of my UIComponent 
    */ 
    emitThis(val) { 
     this.emit('thisEvent', val); 
    }, 

    onThat(func) { 
     this.on('thatEvent', func); 
    }, 

    doThis() { 
     this.specificLog("i'm doing this"); 
     // do stuff 
    } 

    /* 
    * Here i just implement all methods of EventEmitter... 
    */ 
    on(...args) { 
     this.ee.on(...args); 
    } 

    once(...args) { 
     this.ee.once(...args); 
    } 

    emit(...args) { 
     this.ee.emit(...args); 
    } 

    /* this goes on and on... */ 
} 

ли Javascript (ES5, ES6, ES2015) позволяют немного более хороший образец для этой цели?

+1

Изготовление Реагировать компонент испускают кажется, бороться с нормальной React архитектуры, но не обращая внимания, что вы определенно можете смешать по реализации эмиттер событий как если вы используете тот, который написан с учетом этого. – loganfsmyth

+0

Это противоречит нормальной архитектуре React. Я бы хотел избежать такого типа шаблона (в котором мне нужно переписать все методы eventEmitter - на самом деле мне нужно использовать более сложный класс, который сам наследует от eventEmitter ...) – Sebastien

+0

См. [Множественное наследование/прототипы в JavaScript] (http://stackoverflow.com/q/9163341/1529630). Вы можете использовать proxys. – Oriol

ответ

1

Узор в ES6 в основном смесь в этой глубоководной копии родительского прототипа детского прототипа, что-то вроде этого

class FosterParent { ...} 

class Child extends Parent { ...} 

let proto = FosterParent.prototype; 

do { 
    for (const key of Object.keys(proto)) 
    if (!(key in Child.prototype)) 
     Child.prototype[key] = proto[key]; 
} while (proto = Object.getPrototypeOf(proto)) 

Код выше упрощена, потому что он копирует ПЕРЕЧИСЛИМЫЕ ключи и не дескрипторы.

В декораторах ES.Next или TypeScript выходят на помощь. @mixin decorator from core-decorators package должен делать то же самое, как описано, но с аккуратным синтаксисом:

class FosterParent { ...} 

@mixin(FosterParent) 
class Child extends Parent { ...} 
Смежные вопросы