【发布时间】:2016-11-18 12:11:01
【问题描述】:
我正在尝试使用 ES6 类建立一个类层次结构。
所有实体都将继承自单个 Base 类。它将需要以通用方式访问Child 类公开的属性。像这样:
class Base {
constructor() {
this.doSomethingWithProps();
}
doSomethingWithProps() {
console.log(Object.keys(this));
}
}
class Entity extends Base {
constructor() {
super();
this.key = "value";
}
}
显然,在上面的示例中,Base 类将看不到由 Entity 设置的 key 属性。理想情况下,我会将this 分配移到super() 之前,但这是不允许的。能够在构造函数之前设置属性也很好,但是AFAIK,这也是不可能的。
我剩下的唯一解决方案是在每个 Entity 中执行以下操作:
class Base {
doSomethingWithProps() {
console.log(Object.keys(this));
}
}
class Entity extends Base {
constructor() {
super();
this.key = "value";
this.doSomethingWithProps();
}
}
但是,除了不太理想之外,如果我想从Entity 继承也会产生问题。 doSomethingWithProps 然后需要能够检测它是否是调用层次结构中的“最顶层”方法,然后才做它的事情。实现那个(我能想到的)的唯一方法将涉及甚至更多样板。
我在这里缺少一些解决方案吗?如果需要,我愿意使用不同的 OOP 模式,但我希望尽可能接近原生 ES6 类。
【问题讨论】:
-
通常最好依赖组合而不是继承,因为它可能导致脆弱的基类。您仍然可以使用类,但在其中注入另一个包含您需要的方法的类。如果您确实走课程路线,这也可能会有所帮助:medium.com/@dan_abramov/…
-
如果基类知道派生类,那么就大错特错了。
-
@zeroflagL 它不完全是,只是通用初始化逻辑。例如。强制所有属性,验证没有分配任何非法内容等。由于 js 的动态特性,必要的健全性检查。
标签: javascript oop design-patterns ecmascript-6