0

我可以像这样在创建字符串值之后从外部设置一个类的属性

class Class {
  //Nothing
}

let storageClass = new Class();

storageClass['value'] = 'Hello World';

document.write(storageClass.value);

但是我需要跟踪所有属性的更改,以便我可以使用getand set,但是我不能仅基于 . 添加新属性storageClass['value'] = 'Hello World';。例如,如果我想做的话,我必须添加 get 和 set 函数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);

如果我知道创建类时可以创建的所有属性,是否还有办法做到这一点?

4

2 回答 2

1

您可以使用 aProxy来处理动态获取和设置操作。

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

于 2020-12-12T01:51:37.917 回答
0

您可以get/set使用 ES6Proxy构造为所有属性创建一个,它允许您为对象实现低级方法(例如get,在访问任何属性时调用)。

有关详细信息,请参阅Mozilla 的文档

请注意,作为 ES6 功能,它具有广泛但不通用的浏览器支持(例如,在 Internet Explorer 中不起作用),并且不能被 polyfill,因为它使用的功能在旧版本的 JavaScript 中不存在。

于 2020-12-12T01:54:55.130 回答