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

如何观察任何变量的变化(任何变量,而不仅仅是对象)?

  •  0
  • yarek  · 技术社区  · 5 年前

    在Ecma6中,现在很容易观察到 对象 多亏了代理

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

    我正在寻找一种观察任何变量的方法(不仅是对象,还有int、String..)

    前任:

    let s = "hello";
    s = "world"; // should trigger an event when telling me that s has changed
    let x=1;
    x = 2; //should trigger an event when telling me that x has changed
    let o = {"foo":"bar};
    o.foo = "bar2"; //should trigger an event when telling me that o has changed 
    

    找到了一些线索 定义属性 ,但无法将其应用于“let”变量

    Listening for variable changes in JavaScript

    1 回复  |  直到 5 年前
        1
  •  0
  •   Patrick Roberts Benjamin Gruenbaum    5 年前

    出于完整性考虑,我觉得值得分享的是,至少你所要求的一些功能是 从技术上讲 可能吧,不过我 非常 建议探索一种不同的方法来解决潜在的问题。

    使用 with 不建议使用该语句,因为它可能会导致令人困惑的错误和兼容性问题。

    使用 with 声明和声明 Proxy ,有可能捕获任务,因为您实际上是在拦截 Environment Record 添加到范围中。具有 let 然而,这是绝对不可能的。

    const handler = {
      has(target, key) {
        return typeof key === 'string';
      },
      set(target, key, value) {
        console.log(key, 'has changed');
        switch (typeof value) {
          case 'function':
          case 'object':
            value = new Proxy(value, handler);
        }
        return Reflect.set(target, key, value);
      }
    };
    
    with (new Proxy(Object.create(null), handler)) {
      s = 'world';
      x = 2;
      o = { foo: 'bar' };
      o.foo = 'bar2';
      let v = []; // not trapped
    }