我可以在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模式,可以让我做到以下几点:
- 从父类inheritance静态方法。
- 在父类中引用类variables(或类似的东西),以便可以为不同的子类指定它们
- 不必显式引用子类中的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
- 检查nodejs中的inheritance
- 如何从基于对象的语言转移到服务器端Node.js JavaScript的大项目?
- 如何在Node.js的模块中使用Object.create进行inheritance
- 复杂的循环Node模块依赖抛出“TypeError:”inheritance“的超级构造函数必须有一个原型”
- 带有Node.js的数据库inheritance模型
- 如何在Node.JS中实现inheritance
- 问题获取Node.js Express 3.x模板inheritance与Swig通过consolidate.js
- Javascriptinheritance对象覆盖其他inheritance对象
- 创build单节点模块以访问在coffeescript中创build的单独文件中的多个扩展类