当类的实例在 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 中需要不同的函数和变量时,有啥更好的方法?的主要内容,如果未能解决你的问题,请参考以下文章

当类的指针实例超出范围时不调用析构函数是真的吗?

在java中变量和属性有啥不同

Java的作用域

类的初始化列表的必要性

c++里面的protect和public、private有啥区别?

java 类方法和实例方法 以及 类变量和实例变量 各种区别