Javascript - 将 class 个实例保存到 hashtable/object 中并使用键实例函数

Javascript - Saving class instances into hashtable/object and using key instance function

我有 2 个 classes 密钥和会话,它们在每个 class 实例上输出唯一的 "this.session/this.key" 值:

//self executing function or IIFE(Immediately Invoked Function Expression) 
//classes that return unique key and sessions on every instance

const Session = (() => {
    let lastSession = 80
    return class Session{
        constructor(){
            this.session = lastSession
            lastSession++
        }

        printSession(){
            console.log(this.session)
        }
    }
})()

const Key = (() => {
    let lastKey = 0

    return class Key{
        constructor(){
            this.key = lastKey
            lastKey++
        }

        printKey(){
            console.log(this.key)
        }
    }
})()

我有第三个 class 管理器,它将 {Key:Session} 实例对添加到 Object/Hashtable:

class Manager{
    constructor(){
        this.allSessions = {}
    }

    addSession(){
        this.allSessions[new Key] = new Session
    }

    printSessions(){
        for(let key in this.allSessions){
            console.log(`${key} : ${this.allSessions[key]}`)
            //key.printSession()
            //console.log(key.key)
            //this.allSessions[key].printSession()

        }
    }

}

有2个问题:

1) hashtable/object 在任何给定时间只有 1 个 {Key:Session} 对。不管多少 我进行的 addSession() 调用。这是因为它 将所有 Key 实例视为相同?我该如何解决这个问题。

2)在Manager class中的printSessions()函数中,我似乎无法打印出密钥 使用我在键 class 中定义的 key.printKey()?这是为什么?我也试过 console.log(key.key) 也没有用。

您正在尝试使用 Key class 的实例作为对象 属性 名称。那行不通; 属性 名称始终是字符串,因此对象(Key 对象)被隐式转换为字符串。这总是导致字符串“[object Object]”。

您可以试试

    this.allSessions[new Key().key] = new Session

Plain JavaScript objects 确实 seem 像哈希表,但键只能是字符串。您可能想探索地图类型。

您调用实例 key 并且该实例还有一个名为 key 的 属性 的事实可能是您犯此错误的原因。

此外,打印 this.allSessions[key] 并不是很有帮助,因为它是一个对象。也许你打算:this.allSessions[key].session:

class Manager{
    constructor(){
        this.allSessions = {}
    }

    addSession(){
        this.allSessions[(new Key).key] = new Session
    }

    printSessions(){
        for(let key in this.allSessions){
            console.log(`${key} : ${this.allSessions[key].session}`)
        }
    }
}