我通过使用WeakMap()
编写了一些具有私有变量的类。我通过在类文件的顶部放置一个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,它们具有验证和类型检查功能。
现在,我想将那个类扩展到另一个类,但在子类和父类文件之间共享私有属性信息时遇到了问题。
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
这是因为这些函数分布在两个文件中吗?有没有办法解决这个问题,让我可以同时使用私有变量和类扩展?
发布于 2019-05-20 01:28:14
您的问题之一是在传递函数的地方使用setInterval。当该函数被调用时,this
不是您所期望的。您可以像setInterval(this.lightSwitch.bind(this),5000)
一样使用bind来强制它成为您想要的东西
https://stackoverflow.com/questions/56209784
复制相似问题