我可以在ES6的父类的静态方法中使用类variables吗?

对不起,如果这是奇怪的或反模式。

假设我有一个子类的静态方法,例如(为了可读性而严格简化)

class User extends Model { //... static getAll(){ db.execute('SELECT * FROM users'); } } 

由于我有多个模型,我可能想要一个getAll方法,所以在Model类上定义getAll似乎很理想,它引用了一个tableName类variables。 理想情况下,它会看起来像

 class Model { static getAll(){ db.execute(`SELECT * FROM ${this.tableName}`); } } //... User.tableName = 'users'; 

这是行不通的,因为ES6不喜欢你定义这样的类variables。 有许多解决方法 ,例如在父项中添加tableName参数,然后在User中将User应用于该项:

 class Model { static getAll(tableName) { db.execute(`SELECT * FROM ${tableName}`) } } //... class User extends Model{ static getAll() { Model.getAll('users') } } 

但是像这样明确地重写所有类的孩子的inheritance函数似乎是极其反模式的。 我见过的其他解决scheme(例如使用静态函数来返回常量,或者将两个类包装在一个对象中)有点儿丑陋,而不是我想要承诺的模式,除非必须。 所以我正在寻找一个易于阅读的ES6模式,可以让我做到以下几点:

  1. 从父类inheritance静态方法。
  2. 在父类中引用类variables(或类似的东西),以便可以为不同的子类指定它们
  3. 不必显式引用子类中的inheritance方法。

这样的解决scheme是否存在,还是值得在ES5中“硬”的方式?

这是行不通的,因为ES6不喜欢你定义这样的类variables。

什么让你有那个想法? User是一个像其他function一样的function。 静态方法成为该函数的属性。 直接给User分配属性工作得很好。

 class Model { static getAll() { return `SELECT * FROM ${this.tableName}`; } } class User extends Model {} User.tableName = 'users'; class Product extends Model {} Product.tableName = 'product'; console.log(User.getAll()); console.log(Product.getAll()); 

虽然这感觉有点ha – – 有一种方法可以用ES6类的这两个事实来实现你所需要的:

  • 我们可以在类定义中使用static get来定义静态getter,这些getter将作为静态属性来使用。
  • 静态方法可以使用this来调用其他静态方法 。 这意味着你的父类的静态方法可以用this来引用你的子类中的静态方法。

总之,代码看起来像这样:

 class Model { static getAll() { console.log(this.tableName); // will refer to child's static getter } static randomFunc() { console.log(this.tableName); // will also refer to child's static getter } } class User extends Model { static get tableName() { return "users"; // define child's tableName here } } class Worker extends Model { static get tableName() { return "workers"; // define child's tableName here } } User.getAll(); // prints users User.randomFunc(); // prints users Worker.getAll(); // prints workers Worker.randomFunc(); // prints workers