【问题标题】:Anything wrong with overwritting class instance methods? [closed]覆盖类实例方法有什么问题吗? [关闭]
【发布时间】: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


【解决方案1】:

你给出的例子非常做作,所以这个问题的答案将取决于现实世界的情况。

某些情况下覆盖特定对象的方法很有用。例如,这通常在单元测试期间完成。

我认为通过子类化和多态来完成此操作更为常见。

但是,在现实世界中,我认为子类和多态性的用途并不多(有许多值得注意的例外),而且通常情况下最好以命令式或函数式的方式完成。

所以恕我直言,这里没有一个真正的答案。

【讨论】:

  • 所以恕我直言,这里没有一个真正的答案。 这就是为什么这个问题应该以基于意见的方式结束 - 例如“在我认为的现实世界中。 ..” :-)
猜你喜欢
  • 2011-11-03
  • 2012-07-19
  • 2012-09-27
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
相关资源
最近更新 更多