Vue2 里为什么不在 Object.defineProperty 的get 函数里进行属性递归?

Vue2 里为什么不在 Object.defineProperty 的get 函数里进行属性递归?
如果这样设计的话,在初始化阶段对深度嵌套的对象是一种优化。

类似这样

function isObject(val) {
  return typeof val === "object" && val !== null;
}
function observe(obj) {
  for (let key in obj) {
    let val = obj[key];
    
    Object.defineProperty(obj, key, {
      get: function () {
        console.log("触发 getter");
        if (isObject(val)) {
          observe(val);
        }
        return val;
      },
      set: function (newVal) {
        console.log("触发 setter", newVal);
        val = newVal;
      },
    });
  }
}
阅读 2.7k
1 个回答

性能问题,每次递归整个对象非常耗性能,递归层次太深的话递归调用栈可能会溢出,时机也不太对放在 getter 里只有读的时候才会观察子对象,会漏掉其他更新还有延迟,还有就是,每次读的时候观察子对象,这样会重复观察,浪费资源,vue2的设计团队肯定是经过了权衡才定的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题