【发布时间】:2018-02-19 02:51:27
【问题描述】:
我最近主要通过the article Real Mixins with javascript classes在javascript中看到了Mixin的概念。据我了解,这是一种使用抽象类进行多重继承的方法,它更像是组合而不是继承。我也在阅读关于继承的概念组合,如the article Composition Over Inheritance。我知道关于继承和组合的讨论可能会很长,但我选择尽可能避免继承(至少现在是这样)。
所以我想在 ES6 中尽可能多地使用 Mixins,在大多数示例中,我看到了三个类,例如 class A extends MixinB(C)。如果我只想扩展 B 类怎么办?我会做类似class A extends MixinB(Object) 的事情吗?正如Mozilla documentation 所说,这可能是一种反模式。
请注意,我可以像 class A extends B 那样直接继承,但是像这样 B 不再是 Mixin,如果我想将它用作 Mixin,我需要一个不同的 B 声明。
【问题讨论】:
-
“继承并不总是正确的模式”并不意味着“把你学到的这个新东西塞进你以前使用继承的每个地方”。
-
请注意,有些 JavaScript 博主完全搞错了构图。 reddit.com/r/programming/comments/5dxq6i/… 。 Mixin 和多重继承确实是一回事,但组合都不是。
-
> 正如 Mozilla 文档所述,这可能是一种反模式。 | MDN 文档说的是猴子补丁,这确实很糟糕,但是猴子补丁不是
class extends所做的。 -
@JeffM ... 与您的 reddit 链接用户 MoTTs_ 确实提到了
aggregation。所以当评论说组合是包含,继承是混合时,应该更正为包含是聚合,“混合”可以通过组合和继承来实现。当人们使用某种 Mixin/Trait 模式时,Object.assign或class ... extends他们,至少在 JavaScript 中,总是在编写;但继承还提供/涵盖子类型。然后 OP 的 Q 将变为 “如何将 Mixins 用于每种类型的组合?” -
@PeterSeliger 组合和聚合实际上是一回事。它们仅在所包含对象的所有权上有所不同。然而,我们选择区分 mixin 或 trait 或继承并不会改变我们遇到的具体问题。例如,
Object.assign仍然容易受到脆弱基础问题的影响,这是我们通常与继承相关联的问题。
标签: javascript class inheritance design-patterns mixins