首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在对私有变量使用WeakMap时,JavaScript扩展类

在对私有变量使用WeakMap时,JavaScript扩展类
EN

Stack Overflow用户
提问于 2019-05-20 00:26:15
回答 1查看 354关注 0票数 2

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

light.js

代码语言:javascript
复制
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

代码语言:javascript
复制
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时,它不能访问对象的状态。

代码语言:javascript
复制
Uncaught TypeError: Cannot read property 'state' of undefined
    at lightSwitch 

这是因为这些函数分布在两个文件中吗?有没有办法解决这个问题,让我可以同时使用私有变量和类扩展?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-20 01:28:14

您的问题之一是在传递函数的地方使用setInterval。当该函数被调用时,this不是您所期望的。您可以像setInterval(this.lightSwitch.bind(this),5000)一样使用bind来强制它成为您想要的东西

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56209784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档