2016-08-03 37 views
1

我有點在JavaScript中繼承。比方說,我有一個下面的類:動態從JavaScript中的類的實例繼承

class Parent { 
    constructor({ name, someOtherStuff } = {}) { 
    this.name = name; 
    this.someOtherStuff = someOtherStuff; 
    } 

    someMethod() { 
    // ... 
    } 
} 

,我想創建一個裝飾,讓我做以下操作:

@parent({ 
    name: 'foo', 
    someOtherStuff: 'bar' 
}) 
class MyClass extends Component { 
    myMethod() { 
    // ... 
    } 
} 

const instance = new MyClass(); 

// Those tests must pass 
expect(instance.someMethod).toBeFunction(); 
expect(instance.name).toEqual('foo'); 
expect(instance.someOtherStuff).toEqual('bar'); 
expect(instance.myMethod).toBeFunction(); 
expect(instance instanceof Parent).toBe(true); 
expect(instance instanceof MyClass).toBe(true); 

有沒有一種方法來創建這樣的裝飾?我嘗試了多種解決方案,但他們都沒有真正滿足所有的測試。

const parent = (...args) => (Target) => { 
    // Target corresponds to MyClass 
    const parent = new Parent(...args); 

    // ... 
}; 

lodash是允許的。

+0

「裝飾者」,你的意思是Python像裝飾? – Arnial

+0

@Arnial:https://github.com/wycats/javascript-decorators/blob/master/README.md。 –

+0

我的意思是:https://github.com/wycats/javascript-decorators – Ch4rAss

回答

3

爲什麼使用裝飾器?你可以擴展父類

class MyClass extends Parent { 
    constructor() { 
     super({name: 'foo', someOtherStuff: 'bar'}); 
    } 
} 
+0

他正在探索該語言的一個新功能,並想知道他是否可以以某種方式使用它,但有困難。他並不是問如何以傳統的方式去做。 –

+0

我需要一個裝飾器,因爲它假設是我構建的庫的一個特性。此外,它將與已經從Component類繼承的反應組件一起使用 – Ch4rAss

1

你可以使用裝飾器來創建一個新類,繼承,應用一些mixin,並從那裏開始。 JS類沒有多重繼承,所以你不能直接做這件事,但你可以手動組合這兩者,或者創建一個代理來做你想做的事。

我已經使用了decorator-based DI library包裝類返回一個類like so了:

static wrapClass(target, {hook = noop} = {}) { 
    return class wrapper extends target { 
    static get wrappedClass() { 
     return target; 
    } 

    constructor(...args) { 
     super(...Injector.fromParams(args).getDependencies(wrapper).concat(args)); 
    } 
    } 

}

的裝飾是真的關閉了原來的返回一個新的構造,但對於已經足夠大多數目的。