JavaScript在将WeakMap用于私有变量时扩展了一个类

时间:2019-05-19 16:26:15

标签: javascript ecmascript-6 es6-modules es6-class weakmap

我写了一些通过使用azure service具有私有变量的类。为此,我在类文件的顶部放置了一个WeakMap()

light.js

WeakMap

这很好用,我能够添加一些具有验证和类型检查的getter和setters。

现在,我想将该类扩展到另一个类,但是在子类和父类文件之间共享私有属性信息时遇到麻烦。

flashingLight.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);
  }
}

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); } } 内部的this.lightSwitch函数调用setInterval时,它无法访问对象的状态。

startFlashing

这是因为这些功能分散在两个文件中吗?无论如何,我可以同时使用私有变量和类扩展吗?

1 个答案:

答案 0 :(得分:2)

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