Javascript 模块化JS中的类扩展
假设我有一个通用类模块:Javascript 模块化JS中的类扩展,javascript,class,ecmascript-6,extension-methods,Javascript,Class,Ecmascript 6,Extension Methods,假设我有一个通用类模块: 导出类MyCalc{ 数据={} ... } 我想扩展更多功能: 导出类MyCalcLoader{ 加载=一些\u数据=>{ this.data=一些_数据; } } 导出类MyCalcUI{ 打印=()=>{ document.write(JSON.stringify(this.data)); } } 扩展MyCalc并使用这些扩展/插件的适当方式是什么 从“/MyCalc.js”导入{MyCalc}; 从“/MyCalcLoader.js”导入{MyCalcLo
导出类MyCalc{
数据={}
...
}
我想扩展更多功能:
导出类MyCalcLoader{
加载=一些\u数据=>{
this.data=一些_数据;
}
}
导出类MyCalcUI{
打印=()=>{
document.write(JSON.stringify(this.data));
}
}
扩展MyCalc
并使用这些扩展/插件的适当方式是什么
从“/MyCalc.js”导入{MyCalc};
从“/MyCalcLoader.js”导入{MyCalcLoader};
从“/MyCalcUI.js”导入{MyCalcUI};
//TODO:MakeMyCalcExtendLoaderAndUi();
BankingCalc类扩展了MyCalc{
配置={…}
构造函数(){
超级();
}
}
const banking_calc=新银行计算();
银行业计算负荷({…});
银行业务计算打印();
我已经考虑过几种不同的janky方法来实现这一点,但我相信这已经足够普遍了,而且香草ES6有一种正确的方法来实现这一点。你可以使用Mixin:
export const MyCalcLoader = Super => class MyCalcLoader extends Super {
load = some_data => {
this.data = some_data;
}
}
export const MyCalcUI = Super => class MyCalcUI extends Super {
print = () => {
document.write(JSON.stringify(this.data));
}
}
然后将类组合为:
class BankingCalc extends MyCalcLoader(MyCalcUI(MyCalc)) {
//...
}
哦,那是克里弗。现在查看“js mixins”,看看您可以创建一个函数,将每个扩展的所有原型分配给原始类。在尺寸上试试这个。@phil使用原型会让你在构造器上遇到麻烦。这就是我所想的。所以我也做了这件事,它成功了:
const banking_calc=new(MyCalcLoader(MyCalcUI(MyCalc))({…config})代码>@phil如果你只需要一个实例,那么是的。如果需要多个实例,则应声明一个类(否则实例具有不同的原型链,这对性能不利)