【发布时间】:2021-04-11 16:52:44
【问题描述】:
覆盖 ES6 类的实例方法是不好的做法吗?
假设我有一个类Person,类Person 的所有实例都有一个wakeUp 方法,默认调用washFace() 和eatBreakfast() 函数。这是所有 Person 实例所需的回退行为,但是某些实例可能有不同的 wakeUp 例程,对于那些我覆盖默认的 wakeUp 方法的实例:
class Person {
constructor(name) {
this.name = name;
}
wakeUp() {
washFace()
eatBreakfast()
}
}
const user1 = new Person('Jon Doe');
const user2 = new Person('Jane Doe');
user1.wakeUp = () => {
washFace()
drinkCoffee()
}
user2.wakeUp = () => {
washFace()
drinkTea()
}
这可以按预期工作,但是我在使用中并不经常看到它,所以我只是想知道这是否是一种不好的做法/为什么?
编辑:上面的示例只是一个简化,这是针对 CRUD 钩子库的,某些实例对 CRUD 钩子有自己的行为,不与任何其他实例共享,并且仅适用于特定的那个,例如。此特定实例调用 foo 的 onDelete,此外,所有实例均已创建并记录在代码库中
【问题讨论】:
-
你的用户真的是这样,还是你想要子类?
-
表示奇怪的设计。你有真实的例子吗?
-
"按预期工作" - 不,它没有。调用方法需要使用
this.,不能使用箭头函数作为方法。 -
我认为最好定义每个行为,也许这会对您有所帮助:hacks.mozilla.org/2015/08/es6-in-depth-subclassing
-
重写方法并没有错误 - 这样做只是错误的。这是一个设计问题,因此只会带来意见。
标签: javascript ecmascript-6 es6-class