合并2个班级

时间:2018-05-15 10:22:29

标签: javascript ecmascript-6 es6-class

我想合并2个类或将所有方法从1个类添加到另一个类。将来它将是更多的类而不仅仅是一个(ContainerClient)类。

ClientContainerClient

我试过了,但我认为可以做得更轻松。

for (var a of Object.getOwnPropertyNames(ContainerClient.prototype)) {
  Client.prototype[a] = ContainerClient.prototype[a];
}

原则:ContainerClient取决于Client

Data.js

class Data {
  constructor () {

  }
}

Client.js

class Client extends Data {
  me () {
    return {
      id: '1',
    };
  }
}

Container.js

class Container extends Data {
  containers () {
    return [
      {
        clientId: '1',
        id: '2',
      },
      {
        clientId: '2',
        id: '3',
      },
    ];
  }
}

ContainerClient.js

class ContainerClient extends Data {
  containers () {
    return {
      clientId: '1',
      id: '2',
    };
  }
}

- >在export< -

之前的Client.js
// --> HERE <--
for (var a of Object.getOwnPropertyNames(ContainerClient.prototype)) {
  Client.prototype[a] = ContainerClient.prototype[a];
}

// -> [ 'constructor', 'me', 'containers' ]​​​​​ 
console.log(Object.getOwnPropertyNames(Client.prototype));

index.js

const client = new Client();
const container = new Container();

// -> { clientId: '1', id: '2' }​​​​​ 
console.log(client.containers());

1 个答案:

答案 0 :(得分:1)

首先简短回答:你所做的是(差不多)你能做的最好的事情。对于微小的改进,你可以用Object.assign替换for循环,这会将它缩短一行,但它仍然会做同样的事情。

现在答案很长。

我会说,我同意这个设计的许多评论(如代码味道)。最有可能的是不应该继承,每种类型都应该使用其他实例。客户端使用数据对象。容器应该是一组客户端对象。等等。

根据该免责声明,这是您问题的直接答案。

您正在寻找的名称是多重继承/混合。 Python只是一个简单的示例,本身支持多重继承,所以在Python中你可以编写:

class Client(Data, ContainerClient):
    ...

但JavaScript的原型链仅支持单继承,因此您必须解决某种变通方法。一个这样的解决方法creates subclasses on the fly with a variable base。类似的东西:

const ClientMixin = Sup => class extends Sup {
    // ...
};
const ContainerMixin = Sup => class extends Sup {
    // ...
};

然后你可以像这样定义你的具体类:

class Container extends ContainerMixin(Data) {
    // ...
}

class ContainerClient extends ClientMixin(ContainerMixin(Data)) {
    // ...
}

这看起来比你现在做的更容易取决于你。因为其他解决方法当然是简单地将属性从一个类复制到另一个类,就像你正在做的那样。