天天看点

Object.defineProperty数据代理exp

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>一个简单的数据代理例子</title>
  </head>
  <body>
    <!-- 数据代理:通过一个对象对另一个对象中属性的读/写操作 -->
    <script>
      let a = { b: 1 };
      let c = { d: 2 };
      // 场景:通过(操作)c读到b,也能修改(写)b
      Object.defineProperty(c, "b", {
        // 通过c访问b时
        get() {
          return a.b;
        },
        // 调用时意味要改变c的b
        set(val) {
          a.b = val;
        },
      });
    </script>
  </body>
</html>

           

首先,验证一下a上有没有b,打印结果如下图,是存在b的

Object.defineProperty数据代理exp

再验证一下c上有没有b,打印如下图,也是有的

Object.defineProperty数据代理exp

来打印一下c,能看到c上原来的属性d:2,同时也存在b,invoke property getter,值为1,及为b服务的get和set方法

Object.defineProperty数据代理exp

这时候来修改一下c.b的数据 =100,并且打印a.b的数据,如下,发现a.b的值被修改了。

Object.defineProperty数据代理exp

继续阅读