对象

时间:2017-12-18 12:10:52

标签: javascript oop ecmascript-6 getter

我有一个看起来像这样的课程

export default class {
  constructor () {
    this.store = {}
  }

  setX (x, y) {
    this.store[x] = y
  }
}

在获取未定义的值时,如何在this.store上定义getter以返回0

让我举个例子:

setX('a', 1)会将this.store['a']设置为1

然后this.store['a']会按预期返回1

但是this.store['b']会返回undefined,但我希望getter返回0代替(并且可能会调用setX('b', 0),但还不确定)。

我知道我可以使用Object.defineProperty来定义自定义getter,我只是不知道如何访问store对象的任意尚未定义的属性。< / p>

这是完全可能还是我必须使用这样的解决方法?

getX (x) {
  return this.store[x] || 0
}

我想避免这种情况,因为this.store[x]看起来更清晰。

1 个答案:

答案 0 :(得分:3)

  

在获得var data = document.getElementsByClassName("aigjdd"); for (var i = 0; i < priceEls.length; i++) { var FinalData = data[i].innerText; alert(FinalData); } 值时,如何在this.store上定义一个getter以返回0

除非您能够预测所有可能支持的属性名称并为其定义getter,否则您需要Proxy get trap,这是ES2015的新版本(并且不能是polyfilled)。代理在性能方面很昂贵,只有在你真正需要时才使用它们。

示例:

undefined

当然,如果您将class Example { constructor () { this.store = new Proxy({}, { get(target, property) { return property in target ? target[property] : 0; } }); } setX (x, y) { this.store[x] = y; } } const e = new Example(); console.log("Setting a"); e.setX("a", "foo"); console.log("a = " + e.store.a); console.log("b = " + e.store.b);设为私有,则只能通过对象上的store方法强制执行访问,这样可以避免使用代理,但代价是{{1} }和getX基于每个实例(目前,private data is coming):

setX