1

私は 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);

  // ...
};

ロダッシュは許可されています。

4

2 に答える 2

3

デコレータを使用する理由 親クラスを拡張するだけです

class MyClass extends Parent {
    constructor() {
        super({name: 'foo', someOtherStuff: 'bar'});
    }
}
于 2016-08-03T14:49:58.910 に答える
1

デコレーターを使用して、継承する新しいクラスを作成し、いくつかのミックスインを適用して、そこから移動できます。JS クラスには複数の継承がないため、これを直接行うことはできませんが、2 つを手動で組み合わせるか、必要な処理を行うプロキシを作成できます。

次のようなクラスを返すことにより、デコレータベースの DI ライブラリのラッパー クラスを使用しています。

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));
    }
  }

}

デコレーターは、元のコンストラクターを閉じた新しいコンストラクターを実際に返していますが、ほとんどの目的にはそれで十分です。

于 2016-08-03T15:23:33.310 に答える