在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);
}
}
此示例使用Objection JS。
因此,如果您已经有一个名为Foo
的{{1}}实例,则只需拨打foo
,而不是foo.getBars(10, 0)
。
答案 0 :(得分:2)
当它为您简化事物(或相当大的缩短您的代码或其他东西)时,这很好,但当然这会让您难以评估使用这两种方法中的哪一种。另外,如果我想从id获取baz 和一个qux怎么办?如果我使用静态方法,则需要两次进入数据库。因此我宁愿建议使用
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);
}
}
这样您就可以Foo.fromId(…).getBaz()
代替Foo.getBaz(id)
。