代码之家  ›  专栏  ›  技术社区  ›  Jack

动态设置类的getter和setter

  •  0
  • Jack  · 技术社区  · 4 年前

    class Class {
      //Nothing
    }
    
    let storageClass = new Class();
    
    storageClass['value'] = 'Hello World';
    
    document.write(storageClass.value);

    但我需要跟踪所有属性的更改,以便使用 get set ,但我不能仅基于 storageClass['value'] = 'Hello World'; storageClass['valueNumberTwo'] = 'A Second Value';

    class Class {
      get value() {
        return this._value;
      }
      
      set value(value) {
        this._value = value;
        console.log('Value Changed');
      }
    }
    
    let storageClass = new Class();
    
    storageClass['value'] = 'Hello World';
    
    document.write(storageClass.value);

    2 回复  |  直到 4 年前
        1
  •  1
  •   Unmitigated    4 年前

    你可以使用 Proxy 处理动态的get和set操作。

    class Class {
      constructor() {
        return new Proxy(this, {
          get(target, prop, receiver) {
            return target['_' + prop];
          },
          set(obj, prop, value) {
            obj['_' + prop] = value;
            console.log('value changed');
          }
        });
      }
    }
    let storageClass = new Class;
    storageClass['value'] = 'Hello World';
    document.write(storageClass.value);
        2
  •  0
  •   David P. Caldwell    4 年前

    您可以创建 get/set 对于使用ES6的所有属性 Proxy get ,当 属性)。

    看到了吗 Mozilla's documentation

    请注意,作为ES6的一个功能,它具有广泛的浏览器支持,但不是通用的(例如,在internetexplorer中不起作用),并且不能进行多填充,因为它使用的功能在旧版本的JavaScript中不存在。