Javascript 在ES6中,我可以在父类的静态方法中使用类变量吗?

Javascript 在ES6中,我可以在父类的静态方法中使用类变量吗?,javascript,node.js,inheritance,ecmascript-6,Javascript,Node.js,Inheritance,Ecmascript 6,对不起,如果这是奇怪的或反模式 假设我在一个子类上有一个静态方法,例如为了可读性而进行了大量简化 class User extends Model { //... static getAll(){ db.execute('SELECT * FROM users'); } } 因为我有多个模型,我可能需要一个getAll方法,所以在Model类上定义getAll似乎很理想,它引用了tableName类变量。理想情况下,它看起来像 class Model { s

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

假设我在一个子类上有一个静态方法,例如为了可读性而进行了大量简化

class User extends Model {
  //...
    static getAll(){
      db.execute('SELECT * FROM users');
    }
}
因为我有多个模型,我可能需要一个getAll方法,所以在Model类上定义getAll似乎很理想,它引用了tableName类变量。理想情况下,它看起来像

class Model {
  static getAll(){
    db.execute(`SELECT * FROM ${this.tableName}`);
  }
}
//...
User.tableName = 'users';
这是行不通的,因为ES6不喜欢您这样定义类变量,例如,在父级中添加tableName参数,然后在用户中向其应用用户:

但像这样显式地为类的所有子类重新编写继承函数似乎是非常反模式的。我见过的其他解决方案,比如使用静态函数返回常量,或者将两个类都包装到一个对象中,都有点难看,除非我必须这样做,否则我不想采用这种模式。因此,我正在寻找一种易于阅读的ES6模式,它允许我执行以下操作:

从父类继承静态方法。 引用父类中的类变量或等价物,以便可以为不同的子类指定它们 不必显式引用子类中的继承方法。
这样的解决方案是否存在,或者是否值得在ES5中以“艰难的方式”这样做?

尽管这感觉有点粗糙,但有一种方法可以通过使用以下两个有关ES6类的事实来实现您所需要的:

我们可以在类定义中使用static get定义静态getter,这些getter将作为静态属性使用。 静态方法可以使用它来调用其他静态方法。这意味着父类的静态方法可以使用它来引用子类中的静态方法。 总之,代码如下所示:

类模型{ 静态getAll{ console.logthis.tableName;//将引用子级的静态getter } 静态随机函数{ console.logthis.tableName;//还将引用子级的静态getter } } 类用户扩展模型{ 静态获取表名{ return users;//在此处定义子表名 } } 类工作者扩展模型{ 静态获取表名{ return workers;//在此处定义子级的表名 } } User.getAll;//打印用户 User.randomFunc;//打印用户 Worker.getAll;//印刷工人 Worker.randomFunc;//印刷工人 这是行不通的,因为ES6不喜欢您这样定义类变量

你怎么会这么想?用户是一个类似于任何其他函数的函数。静态方法成为该函数的属性。将属性直接分配给用户效果很好

类模型{ 静态getAll{ 返回`SELECT*FROM${this.tableName}`; } } 类用户扩展模型{} User.tableName='users'; 类产品扩展模型{} Product.tableName='Product'; console.logUser.getAll;
console.logProduct.getAll;像这样的东西至少能稍微好一点吗?它不能解决在每个孩子身上都必须考虑到父母的所有方法的问题,这是我试图避免的主要事情。我知道,这就是为什么我把它作为一个评论:p因为我知道这不是对你问题的回答,我想我在下面的回答中误解了这一点。从第二个角度看,听起来您可能希望使用Model.getAll而不是User.getAll,对吗?如果是这样的话,我想不出一个办法,这是可行的w/o ahack@ChristianSantos没错-我想使用模型的getAll方法,而不必在用户上重新定义它。这在Ruby和其他OOPL中是可以直接实现的。有没有其他方法可以在保持干燥的同时有效地做同样的事情?也许没有ES6类继承?这看起来是最简单的方法:我不知道静态getter,但看起来它们与正确的类变量只有细微的不同。它确实适用于我的代码,谢谢!呵呵。这以前不起作用-可能是由于其他地方的错误。谢谢你!更好地使用类用户扩展模型{static tableName='users';}
class Model {
  static getAll(tableName) {
    db.execute(`SELECT * FROM ${tableName}`)
  }
}
//...
class User extends Model{
  static getAll() {
    Model.getAll('users')
  }
}