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

javascript - vue 实现数据劫持 通过 new 避免溢出的原理是什么?

韶镜
2023-06-17

最近开始尝试理解 vue 实现 mvvm 实时响应的原理,有一个地方不理解,抽离出来的代码模型如下:

        let data={
            name:"张三",
            add:'山东',
        }
        const keys=Object.keys(data)
        // 方案一
        const obs=new function (obj){
            keys.forEach((k)=>{
                Object.defineProperty(this,k,{
                    get(){
                        return obj[k]
                    },
                    set(val){
                        console.log(`${k}被改了,我要去解析模板.....`)
                        obj[k]=val
                    }
                })
            })
        }(data)
        // 方案二
        // const obs ={}
        // keys.forEach((k)=>{
        //     Object.defineProperty(obs,k,{
        //         get(){
        //             return data[k]
        //         },
        //         set(val){
        //             console.log(`${k}被改了,我要去解析模板.....`)
        //             data[k]=val
        //         }
        //     })
        // })

        const vm={}
        vm._data=data=obs

其中,方案二会产生溢出我能理解,vm._data=data=obs 后vm._data 和 data 就指向了同一个对象,当读取该对象的一个属性时会调用其set,set中return又要重新读取这个属性无限循环导致溢出。
但是为什么方案一(源码中抽离出来的模型),就不会产生这个问题?它和方案二的区别不就是使用new 函数创建的对象吗?但是最后也赋值给 vm._data 和 data 了,为什么就可以避免溢出呢?

共有1个答案

贺华容
2023-06-17

单看一次执行,这两个写法都是正确的;
但是如果第二次执行,data 会被修改掉
`
let data = {}

// 省略上诉代码

// 在初始化下一个组件时候
data = {
}

`

此时之前的defineProperty 在 set 时候,改的是新值。
这地方其实就是多了个函数立即执行,创造一个闭包而已。

 类似资料:
  • 问题内容: 我已经在C中实现了一些排序算法(用于对整数进行排序),并谨慎地用于存储与数据大小有关的任何内容(因此还包括了计数器和填充物),因为该算法也应使用数千兆字节的数据集进行测试整数 这些算法应该很好,并且分配的数据量应该没有问题:数据存储在文件中,并且每次仅加载很少的块,即使将内存中的缓冲区阻塞为任意大小,也可以正常工作。 使用数据集最多4千兆字节(因此16GB数据)的测试可以正常工作(排序

  • 问题内容: 我想用datatyp uint8添加numpy数组。我知道这些数组中的值可能足够大,以至于发生溢出。所以我得到类似: 现在,a是。但是,我希望让uint8太大的值成为uint8允许的最大值,而不是溢出。所以我想要的结果是。 我可以使用以下代码获得此结果: 问题是我的数组很大,因此创建具有更大数据类型的第三个数组可能是内存问题。是否有一种快速且更节省内存的方式来实现上述结果? 问题答案:

  • 本文向大家介绍详解实现vue的数据响应式原理,包括了详解实现vue的数据响应式原理的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要是给不了解或者没接触过 vue 响应式源码的小伙伴们看的,其主要目的在于能对 vue 的响应式原理有个基本的认识和了解,如果在面试中被问到此类问题,能够知道面试官想让你回答的是什么?「PS:文中如有不对的地方,欢迎小伙伴们指正」 响应式的理解 响应式顾名思义就是数

  • 问题内容: 在阅读有关如何避免json劫持的文章时,我遇到了各种方法,包括发布所有内容或添加响应,因此它们不是有效的JavaScript。 最常见的前缀方法似乎是在对象或数组之前添加。Angular建议以开头。 为什么角度不使用更标准的方法?一个人不是完全安全吗?在JavaScript中难于使用吗?抛开角度,是否有充分的理由采用不太受欢迎的方法? 问题答案: 阻止将JSON响应解析为JavaScr

  • 问题内容: 我使用Java在Selenium WebDriver中编写了一些测试用例,并在网格(集线器和多个节点)上执行它们。我注意到有一些测试案例由于导致失败。避免并确保始终找到该元素的最佳且可靠的方法是什么? 问题答案: 您永远无法确定会找到该元素,实际上这是功能测试的目的- 告诉您页面上是否有任何更改。但有一两件事肯定是有帮助是添加等待这往往导致元素像

  • 本文向大家介绍React-Router的实现原理是什么?相关面试题,主要包含被问及React-Router的实现原理是什么?时的应答技巧和注意事项,需要的朋友参考一下 1.react-router依赖基础 - history,是一个独立的第三方js库,可以用来兼容在不同浏览器、不同环境下对历史记录的管理,拥有统一的API。具体来说里面的history分为三类: HashRouter:老浏览器的hi