2

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

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

}

this.lightSwitchsetInterval内部的函数调用时,startFlashing它无法访问对象的状态。

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

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

4

1 回答 1

2

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

于 2019-05-19T17:28:13.957 回答