当前位置: 首页 > 知识库问答 >
问题:

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

章茂
2023-08-18

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

共有1个答案

岑经纶
2023-08-18

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

 类似资料:
  • 比如这么写,就会报错 一定要这么写编译才不会出问题

  • rank ▲ ✰ vote url 44 455 162 534 url 为什么代码在一个函数里运行的更快? def main(): for i in xrange(10**8): pass main() 在Python中运行速度: real 0m1.841s user 0m1.828s sys 0m0.012s 然而不把它放在函数里: for i

  • 问题内容: 我正在尝试使用一个字段来获取手动输入,然后使用该数据。 我发现的所有资料都声称我应该使用该函数,但是我还没有找到一个简单的可运行的迷你示例,因此无法正常工作。 我希望有人可以给我打电话,告诉我我做错了什么。这是一个迷你文件: 这给了我一个我可以输入的字段,但是一旦输入数据我就什么也不能做。 我怀疑我的代码不起作用,因为最初它是空的。但是,一旦输入了输入数据,我该如何访问呢? 问题答案:

  • 举例来说,react或vue项目里。CSS用到url的时候,~和@是什么用法。在哪里配置的,MDN里好像也没写这个。求一个完整的步骤

  • 问题内容: 我刚接触PHP,但是多年来我一直在使用类似的语言进行编程。我被以下内容弄糊涂了: 它产生了语法错误:这就是调用。 但这很好用: 碰了一会儿之后,我被告知您不能在默认属性中调用函数。你必须在做。我的问题是:为什么?这是“功能”还是草率的实现?有什么根据? 问题答案: 编译器代码建议这是设计使然,尽管我不知道其背后的官方原因是什么。我也不确定要可靠地实现此功能需要花费多少精力,但是目前完成

  • 问题内容: 我刚读 ISO / IEC 9899:201x委员会草案-2011年4月12日 在其中我发现5.1.2.2.3程序终止 这表示如果您未在中指定任何return语句,并且如果程序成功运行,则main的右大括号}将返回0。 但是在下面的代码中,我没有指定任何return语句,但是它没有返回0 编译 问题答案: 该规则是在C标准的1999版本中添加的。在C90中,返回的状态未定义。 您可以通