iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue对象的深层劫持详细讲解
  • 358
分享到

Vue对象的深层劫持详细讲解

Vue对象深层劫持Vue深层劫持Vue对象劫持 2023-01-06 18:01:30 358人浏览 泡泡鱼
摘要

目录一,前言二,对象属性的深层观测问题1,抛出问题2,测试问题3,查看结果三,对象属性深层观测的实现1,实现思路2,代码逻辑四,data 相关优化五,结尾一,前言 上篇,主要介绍了在

一,前言

上篇,主要介绍了在 Vue 的数据初始化流程中,对象属性的单层劫持是如何实现的

回顾一下,主要涉及以下几个核心点:

  • data 为函数和对象的处理,及当 data 为函数时的 this 指向问题
  • Observer 类:对数据进行观测
  • walk 方法:遍历 data 属性(对象属性遍历)
  • defineReactive 方法:利用 Object.defineProperty 实现数据劫持

本篇,继续对 data 数据进行初始化操作,对象属性的深层劫持

二,对象属性的深层观测问题

1,抛出问题

当前版本的代码逻辑:

如果,data 对象中的属性,还是一个对象(称为obj)

那么,这个对象(obj)中的属性是不会被观测的(目前所说的观测还仅仅停留在数据劫持阶段)

就是说,当前仅实现了对 data 对象中属性的单层劫持,嵌套对象不会被深层劫持

2,测试问题

<script>
  let vm = new Vue({
    el: '#app',
    data() {
      // data函数返回的对象中,obj属性为一个对象,它的属性不会被观测
      return { message: 'Hello Vue', obj: { key: "val" } }
    }
  });
</script>

3,查看结果

new Vue 时,传如的 options 选项中的 data 函数,

data 函数中,属性 obj 的值依然是一个对象 { key: “val” }

对象 { key: “val” } 中的 key,此时没有被添加 get 和 set 方法,说明 key 没有被劫持

三,对象属性深层观测的实现

1,实现思路

TODO:需要先回顾一下,对象属性单层观测的流程

有了 data 对象单层观测的经验,对象属性 obj 深层劫持就简单多了

当对象属性 obj 即将被 Object.defineProperty 劫持时,

再对 obj 对象做一次“对象的单层劫持”

更深层的对象属性劫持,就是在递归执行“对象的单层劫持”

即:当属性为对象类型时(非 null)

继续进行 observe 观测,observe 的递归就实现了对象属性的深层劫持

2,代码逻辑

function defineReactive(obj, key, value) {
  observe(value);// 递归实现深层观测
  Object.defineProperty(obj, key, {
    get() {
      return value;
    },
    set(newValue) {
      if (newValue === value) return
      value = newValue;
    }
  })
}

TODO:需要突出递归的逻辑

四,data 相关优化

TODO:结合对象属性观测的特点,介绍 data 的相关优化

五,结尾

本篇主要实现了 Vue 数据初始化流程中,对象属性的深层劫持,核心思路就是递归;

  • 通过data = isFunction(data) ? data.call(vm) : data;处理后的data一定是对象类型
  • 通过data = observe(data)处理后的 data 就实现了数据的响应式(目前只有劫持)
  • observe 方法最终返回一个 Observer 类
  • Observer类初始化时,通过 walk 遍历属性
  • 对每一个属性进行 defineReactive(Object.defineProperty)就实现对象属性的单层数据劫持
  • 在 defineReactive 中,如果属性值为对象类型就继续调用 observe 对当前的对象属性进行观测(即递归步骤 3~5),这样就实现了对象属性的深层数据劫持

下一篇,数组的劫持

到此这篇关于Vue对象的深层劫持详细讲解的文章就介绍到这了,更多相关Vue对象深层劫持内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue对象的深层劫持详细讲解

本文链接: https://www.lsjlt.com/news/177021.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue对象的深层劫持详细讲解
    目录一,前言二,对象属性的深层观测问题1,抛出问题2,测试问题3,查看结果三,对象属性深层观测的实现1,实现思路2,代码逻辑四,data 相关优化五,结尾一,前言 上篇,主要介绍了在...
    99+
    2023-01-06
    Vue对象深层劫持 Vue深层劫持 Vue对象劫持
  • Vue对象的单层劫持图文详细讲解
    目录一,前言二,Vue 的响应式原理三,对象的劫持三,结尾一,前言 上篇,介绍了 Vue 使用及数据初始化的流程 回顾一下,主要涉及以下几个核心点: initMixin 方法: 原型...
    99+
    2023-01-06
    Vue对象单层劫持 Vue对象劫持 Vue单层劫持
  • SpringBoot中controller深层详细讲解
    在基于spring框架的项目开发中,必然会遇到controller层,它可以很方便的对外提供数据接口服务,也是非常关键的出口,所以非常有必要进行规范统一,使其既简洁又优雅。 cont...
    99+
    2023-02-02
    SpringBoot controller SpringBoot controller层
  • C++详细讲解对象的构造
    目录一、对象的构造(上)1.1 对象的初始值1.2 对象的初始化1.3 小结二、对象的构造(中)2.1 构造函数2.2小实例2.3 小结三、对象的构造(下)3.1 特殊的构造函数3....
    99+
    2024-04-02
  • SpringBoot超详细深入讲解底层原理
    目录手写springbootSpringboot项目自动配置小结手写springboot 在日常开发中只需要引入下面的依赖就可以开发Servlet进行访问了。 <depende...
    99+
    2024-04-02
  • C++OOP对象和类的详细讲解
    目录C++OOP对象和类1.预备知识2.抽象和类2.1 数据抽象2.2 类2.3 接口3.C++中的类和对象3.1 C++类的定义3.2 C++对象的定义3.3 C++访问数据成员3...
    99+
    2024-04-02
  • C++超详细讲解函数对象
    目录一、客户需求二、存在的问题三、解决方案四、函数对象五、小结一、客户需求 编写一个函数 函数可以获得斐波那契数列每项的值每调用一次返回一个值函数可根据需要重复使用 下面来看第一个...
    99+
    2024-04-02
  • C++详细讲解对象的构造顺序
    目录一、局部对象的构造顺序二、堆对象的构造顺序三、全局对象的构造顺序命令行四、小结一、局部对象的构造顺序 对于局部对象 当程序执行流到达对象的定义语句时进行构造 下面看一个局部对象的...
    99+
    2024-04-02
  • JavaScript面向对象编程详细讲解
    这篇文章主要介绍“JavaScript面向对象编程详细讲解”,在日常操作中,相信很多人在JavaScript面向对象编程详细讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • 深入讲解Java的对象头与对象组成
    目录一,对象头1,Mark Word2,指向类的指针3,数组长度二,实例数据三,对齐填充字节总结Java对象保存在内存中时,由以下三部分组成: 1,对象头 2,实例数据 3,对齐填充...
    99+
    2024-04-02
  • Python中关于面向对象概念的详细讲解
    面向对象编程的2个非常重要的概念: 类和对象 对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念——类。 类用来描述具有...
    99+
    2024-04-02
  • Java 超详细讲解对象的构造及初始化
    目录如何初始化对象构造方法特性默认初始化就地初始化如何初始化对象 我们知道再Java方法内部定义一个局部变量的时候,必须要初始化,否则就会编译失败 要让这串代码通过编译,很简单,只...
    99+
    2024-04-02
  • Python中关于面向对象中继承的详细讲解
    目录1.继承2.单继承3.多继承4.子类重写父类的同名属性和方法5.子类调用父类同名属性和方法6.多层继承7.调用父类方法super()8.案例1.继承 在程序中,继承描述的是多个类...
    99+
    2024-04-02
  • vue v-model的详细讲解(推荐!)
    目录v-model的基本使用v-model的原理v-model绑定textareav-model绑定checkboxv-model绑定radiov-model绑定select...
    99+
    2024-04-02
  • Spring超详细讲解面向对象到面向切面
    目录前言一.OOP&AOP二.AOP核心三.第一个AOP案例1.环境准备2.AOP实现步骤四.切入点表达式1.语法格式2.通配符五.AOP通知类型环境准备环绕通知1.返回后通...
    99+
    2022-11-13
    Spring 面向对象 Spring 面向切面
  • Java 超详细讲解类的定义方式和对象的实例化
    目录1.面对对象的初步认识1.1什么是面向对象1.2面向对象与面向过程2.类的定义与使用2.1简单认识类2.2 类的定义格式3.类的实例化3.1什么是实例化?3.2重点笔记总结1.面...
    99+
    2024-04-02
  • Vue组件的渲染流程详细讲解
    目录引言与例子举一个工作中能用到的例子:实现extend执行流程1. 注册流程(以Vue.component()祖册为例子):2. 执行流程3. 渲染流程总结注: 本文目的是通过源码...
    99+
    2024-04-02
  • Redis的持久化和主从复制详细讲解
    本篇内容介绍了“Redis的持久化和主从复制详细讲解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是R...
    99+
    2024-04-02
  • Python中关于面向对象私有属性方法的详细讲解
    目录1.私有属性和私有方法私有属性:私有方法:类部调用私有属性和私有方法子类不能继承父类私有属性和方法实例属性(对象属性)通过实例(对象)去修改类属性2.修改私有属性的值3.类属性和...
    99+
    2024-04-02
  • Python中可变和不可变对象的深入讲解
    目录前置知识 有哪些可变对象,哪些不可变对象? 不可变对象和可变对象的区别? 不可变对象的应用场景 从内存角度出发说下有什么区别? 不可变对象可变对象从代码角度看看区别 不可变对象...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作