gpt4 book ai didi

JavaScript 在对私有(private)变量使用 Wea​​kMap 时扩展一个类

转载 作者:行者123 更新时间:2023-11-29 20:38:08 25 4
gpt4 key购买 nike

我通过使用 WeakMap() 编写了一些具有私有(private)变量的类。我通过在类文件的顶部放置一个 WeakMap 来做到这一点。

light.js

let privateVars = new WeakMap();

class Light {
constructor(state, brightness) {
let info = {"state": state, "brightness": brightness, "createdAt": Date.now()};
// Save info into privateVars
privateVars.set(this, info);
}

switch() {
let info = privateVars.get(this);
info.state = !info.state;
privateVars.set(this, info);
}
}

这工作得很好,我能够添加一些具有验证和类型检查功能的 getter 和 setter。

现在我想将该类扩展到另一个类,但我无法在子类文件和父类文件之间共享私有(private)属性信息。

flashingLight.js

let privateVars = new WeakMap();
let flashing;

import Light from './light.js';

class FlashingLight extends Light {

constructor(state=false, brightness=100, flashMode=true) {
super(state, brightness);
let info = {"state": state, "brightness": brightness, flashMode: flashMode, "createdAt": Date.now()};
privateVars.set(this, info);
if(flashMode===true) {
this.startFlashing();
}
}

startFlashing() {
flashing = setInterval(this.lightSwitch,5000);
}

}

当从 startFlashing 中的 setInterval 函数调用 this.lightSwitch 时,它无法访问对象的状态。

Uncaught TypeError: Cannot read property 'state' of undefined
at lightSwitch

这是因为这些函数分布在两个文件中吗?无论如何,我可以同时使用私有(private)变量和类扩展吗?

最佳答案

您的问题之一是使用 setInterval你传递一个函数的地方。调用该函数时,this 不是您所期望的。您可以使用 bind强制它成为你想要的,比如 setInterval(this.lightSwitch.bind(this),5000)

关于JavaScript 在对私有(private)变量使用 Wea​​kMap 时扩展一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56209784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com