Javascript - 静态方法和实例方法的同名坏习惯?

Pal*_*and 4 javascript class

在 Javascript 中,给静态方法和实例方法同名是否被认为是不好的做法?

假设我有一个表示数据库表 ( Model)的类,并且我想提供 2 个选项来获取某些值:(1) 带有一个 id,(2) 通过一个实例:

class Foo extends Model {

  static getById(id) {
    return Foo.query().findById(id);
  }

  static getBars(id, limit, offset) {
    return Foo.getById(id).then(foo => foo.getBars(limit, offset));
  }

  getBars(limit, offset) {
    return this.$relatedQuery('bars').range(limit, offset);
  }

}
Run Code Online (Sandbox Code Playgroud)

这个例子使用了 Objection JS。

因此,如果您已经有一个Foo被调用的实例foo,则可以直接调用foo.getBars(10, 0),而不是Foo.getBars(fooId, 10, 0).

Ber*_*rgi 6

当它为您简化事情(或显着缩短您的代码或其他东西)时,这很好,但是当然,评估使用两种方法中的哪一种会让人感到困惑。另外,如果我想从 id 中获取 bazqux 怎么办?如果我使用静态方法,则需要两次访问数据库。因此我宁愿建议使用

class Foo extends Model {
  … // constructor
  static fromId(id) {
    return new this({bar: execute(`select bar from foo where id = ${id}`)});
  }
  getBaz() {
    return getBazFromBar(this.bar);
  }
}
Run Code Online (Sandbox Code Playgroud)

这样你就可以做Foo.fromId(…).getBaz()而不是Foo.getBaz(id).

  • 我认为提供*附加*便利功能很好,尤其是当它们非常方便时(例如让您免于编写承诺回调)。只是您的原始示例没有 `fromId`/`getById`,可以在必要时不使用静态方法。也就是说,您可以通过使用其全名“Foo.getBazFromId”或其他名称来命名静态方法来减少混淆。 (2认同)