gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 23:30:35 25 4
gpt4 key购买 nike

抱歉,如果这是奇怪的或反模式的。

假设我在子类上有一个静态方法,例如(为便于阅读而大大简化)

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 不喜欢你这样定义类变量。 There are a number of workarounds ,例如在父级中添加一个 tableName 参数,然后在 User 中对其应用 users:

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

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

  1. 从父类继承静态方法。
  2. 引用父类中的类变量(或等价物),以便可以为不同的子类指定它们
  3. 不必显式引用子类中继承的方法。

是否存在这样的解决方案,或者是否值得在 ES5 中以“困难的方式”来解决?

最佳答案

This won't work, because ES6 doesn't like you defining class variables like that.

是什么让你这么想的? User 是一个类似于任何其他函数的函数。静态方法成为该函数的属性。将属性直接分配给 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());

关于javascript - 我可以在 ES6 的父类静态方法中使用类变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47504534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com