javascript-对象的任意属性的获取器

我有一堂课,看起来像这样

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’]将返回未定义,但我希望getter改为返回0(并且可能不确定setX(‘b’,0)).

我知道我可以使用Object.defineProperty定义一个自定义getter,但我只是无法解决如何访问存储对象的任意(尚未定义)属性的问题.

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

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

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

解决方法:

How would I define a getter on this.store to return 0 when getting an undefined value?

除非您能预料到要支持的所有可能的属性名称并为其定义吸气剂,否则您需要一个Proxyget trap,这是ES2015以来的新增功能(并且不能进行多填充).代理在性能方面很昂贵,仅在真正需要它们时才使用它们.

例:

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);

当然,如果您将商店设为私有,则只能通过对象上的getX方法强制执行访问,这将避免使用代理,而以在每个实例的基础上定义setX和getX为代价(目前为private data is coming) :

class Example {
  constructor () {
    const store = {};
    this.setX = (x, y) => {
      store[x] = y;
    };
    this.getX = x => {
      return x in store ? store[x] : 0;
    };
  }
}

const e = new Example();
console.log("Setting a");
e.setX("a", "foo");
console.log("a = " + e.getX("a"));
console.log("b = " + e.getX("b"));
上一篇:Python的property _getter和setter方法【转】


下一篇:小马哥讲Spring核心编程思想