如何让BaseModel父类访问子类配置以复用静态方法?
解决方案
核心原理是:静态方法中的this指向调用该方法的子类构造函数,所以父类的静态方法可以直接通过this访问子类的静态配置属性,完全不需要子类重写同名方法。
具体实现
1. 编写父类BaseModel
在父类的静态fetch方法里,直接用this.config获取当前子类的静态配置:
class BaseModel { static async fetch() { // 直接通过this拿到子类的static config const { apiUrl, endpoint } = this.config; const response = await fetch(`${apiUrl}/${endpoint}`); return await response.json(); } }
2. 子类仅需定义静态配置
子类只需要声明自己的static config,不用管fetch方法:
class Synapse extends BaseModel { static config = { apiUrl: 'https://api.example.com', endpoint: 'synapses' }; } class Neuron extends BaseModel { static config = { apiUrl: 'https://api.example.com', endpoint: 'neurons' }; }
3. 直接调用子类的静态方法
调用子类的fetch时,父类方法会自动适配子类的配置:
// 用Synapse的配置请求数据 const synapses = await Synapse.fetch(); // 用Neuron的配置请求数据 const neurons = await Neuron.fetch();
可选优化:补全默认配置与校验
如果怕子类漏写config,可以在父类里加兜底逻辑:
class BaseModel { static async fetch() { if (!this.config) { throw new Error('子类必须定义static config属性'); } // 合并默认配置和子类配置 const defaultConfig = { apiUrl: 'https://default-api.com', method: 'GET' }; const finalConfig = { ...defaultConfig, ...this.config }; const response = await fetch(`${finalConfig.apiUrl}/${finalConfig.endpoint}`, { method: finalConfig.method }); return await response.json(); } }
内容的提问来源于stack exchange,提问作者Sebastian Scholl
相关产品推荐
相关产品推荐

