JavaScript 扩展类,同时使用 Wea​​kMap 作为私有(private)变量

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

我通过使用 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 扩展类,同时使用 Wea​​kMap 作为私有(private)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56209784/

相关文章:

javascript - 如何使用 Codeigniter 从数据库填充下拉列表

javascript - 未捕获的 TypeError : (0 , _module) 不是一个函数

javascript - 在脚本中使用 gulp-inline-source 和 ES6 代码

javascript - 未捕获( promise 中)TypeError : Cannot read property 'setState' of undefined

javascript - AddThis 和 Google Page Speed

javascript - Jquery动画错误

javascript - 计算 JSON 数组中值的总和

javascript - 为副作用而导入的 ES6 模块的公认做法?

javascript - PhpStorm 中的传播运算符

javascript - 扩展导入的对象然后再次导出?