Skip to content
html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <input type="text" id="input" />
  <div id="box"></div>

  <body>
    <script>
      let input = document.getElementById("input");
      let box = document.getElementById("box");
      var obj = {
        name: "1",
      };

      // 核心是 Object.defineProperty
      // 初始化 Vue, 给 data 中的属性进行 Object.defineProperty 重新定义,为属性添加 get\set 方法
      // 当属性在模版中进行获取的时候,会调用 get 方法,然后进行依赖收集,在属性发生变化的时候执行 set, 进行相关以来更新

      Object.defineProperty(obj, "name", {
        configurable: true,

        get(v) {
          console.log("this", this);
          console.log("get", v);
        },
        set(value) {
          console.log("this", this);
          console.log("set", value);
          box.innerHTML = value;
        },
      });

      // 输入监听
      input.addEventListener("keyup", function (e) {
        obj.name = e.target.value;
      });
    </script>
  </body>
</html>

<!-- - 分析 vue 响应式原理,vue 对于循环引用是怎么处理的?, defineProperty 传递的 enumerable是false -->

<!-- ## 详细说一下源码中,修改响应式属性后是怎么触发 DOM 更新的 -->
<!--
给 data 中的属性用 Object.defineProperty 重新定义, 为属性添加 get set 方法。
当属性在模版中获取的时候,会调用 get , 然后进行依赖收集。
在属性发生变化的时候进行会执行 set, 通知相关依赖进行派发更新。
-->

在 MIT 许可下发布