Javascript 合并2个类

Javascript 合并2个类,javascript,ecmascript-6,es6-class,Javascript,Ecmascript 6,Es6 Class,我想合并两个类或将所有方法从一个类添加到另一个类。在未来,它将不仅仅是一个(ContainerClient)类,而是更多的类 客户机和集装箱客户机 我试过这个,但我认为它可以做得更容易 for (var a of Object.getOwnPropertyNames(ContainerClient.prototype)) { Client.prototype[a] = ContainerClient.prototype[a]; } 原则:集装箱客户机取决于客户机 Data.js 类数据{

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

客户机
集装箱客户机

我试过这个,但我认为它可以做得更容易

for (var a of Object.getOwnPropertyNames(ContainerClient.prototype)) {
  Client.prototype[a] = ContainerClient.prototype[a];
}
原则:
集装箱客户机
取决于
客户机

Data.js
类数据{
构造函数(){
}
}
Client.js
类客户端扩展数据{
我(){
返回{
id:'1',
};
}
}
Container.js
类容器扩展数据{
容器(){
返回[
{
clientId:'1',
id:'2',
},
{
clientId:'2',
id:'3',
},
];
}
}
ContainerClient.js
class ContainerClient扩展数据{
容器(){
返回{
clientId:'1',
id:'2',
};
}
}

-->导出之前的Client.js此处['constructor','me','containers']​​​​​ 首先是简短的回答:你所做的(几乎)是你能做的最好的。对于一个微小的改进,您可以用Object.assign替换For循环,这样可以将其缩短一行,但它仍然可以做同样的事情

现在,答案很长

首先,我要说,我同意这个设计散发出的许多评论(就像代码散发出的味道一样)。最有可能的情况是不应该有继承,每个类型都应该使用其他类型的实例。客户端应该使用数据对象。容器应该是客户端对象的数组。等等

有了这个免责声明,下面是对你的问题更直接的回答

您正在寻找的名称是多重继承/混合。仅举一个简单的例子,Python本机支持多重继承,因此在Python中您可以编写:

class Client(Data, ContainerClient):
    ...
但是JavaScript的原型链只支持单一继承,所以您必须满足于某种解决方法。一个这样的解决办法。比如:

const ClientMixin = Sup => class extends Sup {
    // ...
};
const ContainerMixin = Sup => class extends Sup {
    // ...
};
然后您可以像这样定义您的具体类:

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

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

这看起来是否比你已经做的更容易取决于你。因为另一种解决方法当然是像您刚才所做的那样简单地将属性从一个类复制到另一个类。

如果
Client
ContainerClient
都扩展
Data
,为什么不让
Client
扩展
ContainerClient
?虽然命名听起来有点违反直觉,但您的描述基本上是这样的。因为未来它将是更多的类,而不仅仅是一个(ContainerClient)类。好吧,我刚刚醒来,所以我可能没有正确地理解这一点,但对我来说,听起来您正在尝试使用一个金锤。你确定不想使用吗?不是“合并”类,而是分离概念——类是对象所需要的东西,功能可以添加到需要它的对象中。在从概念上考虑这一点之后-你有一个
和一个
,你想分享这两个共享的特性-你让人狗讨厌吗?问题中的代码不够具体,无法得到一个具体的答案,但从表面上看,这是一个组合而不是继承的完美案例<代码>客户端扩展数据根本没有意义。客户端使用数据,而不是从中继承。@MátéSafranka是的,mixin可能是答案,但mixin不应使用
class
语法