合并 2 类
Merging 2 classes
我想合并 2 个 class 或将 1 个 class 中的所有方法添加到另一个。将来它将不仅仅是一个 (ContainerClient) class.
classes
Client
和 ContainerClient
我试过了,但我认为它可以做得更简单。
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',
},
];
}
}
容器Client.js
class ContainerClient extends Data {
containers () {
return {
clientId: '1',
id: '2',
};
}
}
--> Client.js 在 export
<--
之前
// --> 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());
首先是简短的回答:你正在做的(几乎)是你能做的最好的。对于一个微小的改进,您可以用 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 {
// ...
};
然后你可以像这样定义你的具体 classes:
class Container extends ContainerMixin(Data) {
// ...
}
class ContainerClient extends ClientMixin(ContainerMixin(Data)) {
// ...
}
这是否看起来比您已经在做的事情更容易取决于您。因为另一种解决方法当然是像您所做的那样简单地将属性从一个 class 复制到另一个
我想合并 2 个 class 或将 1 个 class 中的所有方法添加到另一个。将来它将不仅仅是一个 (ContainerClient) class.
classesClient
和 ContainerClient
我试过了,但我认为它可以做得更简单。
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',
},
];
}
}
容器Client.js
class ContainerClient extends Data {
containers () {
return {
clientId: '1',
id: '2',
};
}
}
--> Client.js 在 export
<--
之前
// --> 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());
首先是简短的回答:你正在做的(几乎)是你能做的最好的。对于一个微小的改进,您可以用 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 {
// ...
};
然后你可以像这样定义你的具体 classes:
class Container extends ContainerMixin(Data) {
// ...
}
class ContainerClient extends ClientMixin(ContainerMixin(Data)) {
// ...
}
这是否看起来比您已经在做的事情更容易取决于您。因为另一种解决方法当然是像您所做的那样简单地将属性从一个 class 复制到另一个