当类的实例在 js 中需要不同的函数和变量时,有啥更好的方法?
Posted
技术标签:
【中文标题】当类的实例在 js 中需要不同的函数和变量时,有啥更好的方法?【英文标题】:What is the better aproach when instances of classes needs different functions and variables in js?当类的实例在 js 中需要不同的函数和变量时,有什么更好的方法? 【发布时间】:2021-10-10 16:53:30 【问题描述】:我有一个名为Gamer
的类,它的每个实例都需要不同的逻辑。所以Gamer
得到一个函数作为参数,但是这个函数需要新的属性(处理自定义函数操作)。那么考虑性能/语义会更好:只需使用gamerInstance.new_attr = ...
添加这些变量或为每个扩展Gamer
类的实例创建一个新类?或者其他我不知道的事情...
请记住,Gamer
的某些实例可能不需要额外的属性。
这个函数作为参数调用array.length(>大于10^6)次
class Gamer
#name;
#function;
constructor(name, function)
this.#name = name;
this.#function = function;
this.number = 0;
static get SOME_CONST() return 5;
//called many times
manageStrategy(index) this.#strategy(this, index);
let gamer1 = new Gamer("Gary", (gamer, index) =>
//do some thing to gamer.number
);
let gamer2 = new Gamer("John", (gamer, index) =>
//do another thing to gamer.number
);
gamer1.new_attr = 0;
gamer1.new_attr2 = [];
//gamer2 doesn't need extra data to handle its function logic
【问题讨论】:
那么为什么不扩展游戏玩家呢?class AwesomeGamer extends Gamer
这是个问题。我认为这不是更好的方法,因为这样我需要为每个实例创建一个类(可以超过 2 个,这只是一个示例)
很难猜到帽子实际上是不同的。该方法确实基于您需要做的事情。无论哪种方式,您都在创建某种新的规则或类实例并使用它。
【参考方案1】:
你可以耦合函数和它的属性。
比如:
class GamerLogicA
propA;
propB;
propC;
init() /*doSomething with propA, propB, propC*/
class GamerLogicB
propD;
propE;
init() /*doSomething with propD, propE*/
class Gamer
#name;
#logic;
constructor(name, logic)
this.#name = name;
this.#logic = logic;
this.#logic.init();
然后你只需注入它:
let g1 = new Gamer('Gary', new GamerLogicA())
let g2 = new Gamer('John', new GamerLogicB());
【讨论】:
以上是关于当类的实例在 js 中需要不同的函数和变量时,有啥更好的方法?的主要内容,如果未能解决你的问题,请参考以下文章