动态继承JavaScript中

时间:2016-08-03 14:42:04

标签: javascript decorator ecmascript-next

我在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。

2 个答案:

答案 0 :(得分:3)

为什么要使用装饰器?你可以只扩展父类

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

答案 1 :(得分:1)

您可以使用装饰器来创建一个继承,应用一些mixins并从那里继续的新类。 JS类没有多重继承,因此您无法直接执行此操作,但您可以手动组合这两者,也可以创建一个可以执行所需操作的代理。

我通过返回类like so一直在为plone.app.users使用包装类:

getCurrentFocus()

}

装饰器实际上正在返回一个新的构造函数,其封闭超过原始构造函数,但这对于大多数用途来说已经足够了。