ECMAscript 6:观察类属性的变化

时间:2017-04-17 23:35:21

标签: javascript class ecmascript-6 watch

假设我的课程定义如下:

class MyClass {

    constructor (a) {
        this.a = a;     
    }

    _onPropertyChanged() {
        // do something
    }
}

每当MyClass实例的属性“a”发生变化时,我想在该实例上触发_onPropertyChanged方法。 使用ECMAscript 6实现这一目标的最佳(最高性能)方法是什么?

4 个答案:

答案 0 :(得分:3)

没有最好的'方式,实际方法总是取决于最终目标。

以其简单(且表现足够)的形式,它是:

class MyClass {

    constructor (a) {
      this.a = a;     
    }

    get a() {
      return this._a;
    }

    set a(val) {
      this._a = val;
      this._onPropertyChanged('a', val);
    }

    _onPropertyChanged(propName, val) {
        // do something
    }
}

答案 1 :(得分:1)

这是您可以针对此情况和单个属性执行的操作的简单示例。

class MyClass {

constructor (a) {
    this._a = a;
}

set a(value) {
    let hasChanged = (this._a !== value);
    this._a = value;
    //Assumes value is primitive. Customize for objects
    if(hasChanged) this._onPropertyChanged();

}

_onPropertyChanged() {
    // do something
}
}

答案 2 :(得分:0)

最简单的方法是为previous comment所说的属性定义一个setter和一个getter。但是,如果您已经有一个已定义的setter,它将无效。

另一种方法是非标准的Object.prototype.watch,它只能在Gecko中本地工作。如果您想将其支持带到大多数其他浏览器,您可以使用小而强大的Andrea Giammarchi's library

答案 3 :(得分:0)

最好的方法是重新定义档案/财产,但在这种情况下,你有一些陷阱,比如找到这个道具的所有者'。你可以使用this解决方案来重新定义完全安全的财产。

如果存在,主要的想法是重新定义属性:

 Object.defineProperty(target, name, {
     get() { return get(ownPropertyDescriptor.get.call(target)); },
     set(val) {
         let _val = set.call(this, val);
         if (_val != undefined)
            ownPropertyDescriptor.set.call(target, _val);
         },
     configurable: true
 });

或者根据symbol类型创建新属性:

var indexer = Symbol(name);
target[indexer] = target[name];
Object.defineProperty(target, name, {
  get() {
         var val = target[indexer];
         var _val = get(val);
           return _val;
     },
  set(val) {
         let _val = set.call(this, val);
         arget[indexer] = set(_val);
     },
  configurable: true
});

Full method is part of complex solution for property-redefining.