vue2响应式原理之Object.defineProperty()方法的使用

 更新时间:2023年10月07日 09:52:19   作者:山海入梦  
这篇文章主要介绍了vue2响应式原理之Object.defineProperty()方法的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

最近一直在研究vue2响应式原理,去官网看一遍文档,好像懂了但又好像不懂,然后去查看别人写的响应式原理和视频,好的理解了百分六七十头皮发麻,vue2的响应式原理实现的核心就是Object.defineProperty()方法,所以自己也跟着手敲一下响应式源码记录对Object.defineProperty的理解

一、Object.defineProperty()

1.概念

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象.

这句话到底什么意思呢?

我们简单实现这个方法

var obj = {}
Object.defineProperty(obj, 'name', {
  value:'科比'
})
console.log(obj.name)  //科比

可以看出Object.defineProperty()能为我们定义一个属性,又有人会想为什么我们不直接定义obj.name='科比',而使用这个方法不更加麻烦吗?

2.Object.definProperty()方法

可以设置额外隐藏的属性使用这些属性能够使对象更加自由的被定义

var obj = {}
Object.defineProperty(obj, 'name', {
  value:'科比',
  //是否可写
  writable: false 
})
Object.defineProperty(obj, 'number', {
  value:24,
  //是否可枚举
  enumerable: false 
})
//修改属性报错
obj.name = "库里"  //Cannot assign to read only property 'name' of object '#<Object>'
console.log(obj.name)  

通过obj对象定义writable: false 使你属性不能修改,如果修改obj.name就会报错;enumerable是否可以枚举,所以使用这些属性能够使对象更加自由的被定义

二、Object.definProperty()方法的get()和set()

代码如下(示例):

通过这个示例可知访问obj.name属性就会触发get()方法,修改obj.name属性触发set()方法

但是我们发现修改obj.name属性为"乔丹",打印为undefined这是为什么呢?

看一下get和set方法的介绍:

get

  • 属性的 getter 函数,如果没有 getter,则为 undefined。当访问该属性时,会调用此函数。
  • 执行时不传入任何参数,但是会传入 this 对象(由于继承关系,这里的this并不一定是定义该属性的对象)。
  • 该函数的返回值会被用作属性的值。
  • 默认为 undefined

set

  • 属性的 setter 函数,如果没有 setter,则为 undefined。
  • 当属性值被修改时,会调用此函数。
  • 该方法接受一个参数(也就是被赋予的新值),会传入赋值时的 this 对象。
  • 默认为 undefined

因为get的函数返回值会被当作属性的值,而我们示例中get和set没有return 任何值,就默认为undefined,修改后:

const obj = {}
Object.defineProperty(obj , 'name' , {
  get(){
    console.log('访问obj.name属性触发')
    return "乔丹"
  },
  set(newValue) {
    console.log('修改obj.name属性触发' , newValue)
  }
})
obj.name  //访问属性
console.log(obj.name)  //乔丹
obj.name = "科比"  //修改属性
console.log(obj.name)  //乔丹

 

能够访问到设置的obj属性了,但是修改了obj.name = "科比"

最后打印还是"乔丹" ,但是set方法触发的newValue是科比这又是为什么呢?

因为getter并不能返回你修改的值,只要你访问obj.name他就是返回return "乔丹"

就如同你设置的set新属性从未改变一样非常固执,那么我们应该怎么解决这个问题呢?

我们可以通过一个变量com进行周转,修改如下:

var obj = {}
var com;  //设置变量周转
Object.defineProperty(obj , 'name' , {
  get(){
    console.log('访问obj.name属性触发')
    return com
  },
  set(newValue) {
    console.log('修改obj.name属性触发' , newValue)
    com = newValue
  }
})
obj.name  //访问属性
console.log(obj.name)  //乔丹
obj.name = "科比"  //修改属性科比
console.log(obj.name)  //最后控制台打印 科比

详细了解Object.defineProperty()方法

总结

vue2的响应式原理核心就是基于Object.defineProperty()方法实现的哟,不过完整的响应式源码可不止这样简单,所以下一篇博客就是手敲完整vue2响应式源码实现,加深理解.

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue移动端UI框架实现QQ侧边菜单组件

    vue移动端UI框架实现QQ侧边菜单组件

    这篇文章主要介绍了vue移动端UI框架实现仿qq侧边菜单组件,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-03-03
  • vue3中安装并使用CSS预处理器Sass的方法详解

    vue3中安装并使用CSS预处理器Sass的方法详解

    Sass是一种CSS预处理器,它扩展了CSS的功能,提供了更高级的语法和特性,例如变量、嵌套、混合、继承和颜色功能等,这些特性可以帮助开发者更高效地管理和维护样式表,本文介绍vue3中安装并使用CSS预处理器Sass的方法,感兴趣的朋友一起看看吧
    2024-01-01
  • Vue ElementUI中Upload组件批量上传的实现代码

    Vue ElementUI中Upload组件批量上传的实现代码

    ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使用ajax方式上传多个文件,后台接口接收多文件并返回上传结果,本文介绍Vue ElementUI中Upload组件如何批量上传,感兴趣的朋友一起看看吧
    2025-02-02
  • 传说中VUE的语法糖到底是做什么的

    传说中VUE的语法糖到底是做什么的

    从接触Vue我们就知道 v-model是实现数据双向绑定的那他能实现绑定的原理到底是啥?最常见的语法糖 v-model,今天通过案例给大家详细介绍下,需要的朋友参考下吧
    2021-09-09
  • Vue首评加载速度及白屏时间优化详解

    Vue首评加载速度及白屏时间优化详解

    这篇文章主要介绍了vue项目优化首评加载速度,以及白屏时间过久的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09
  • 使用vue实现滑动滚动条来加载数据

    使用vue实现滑动滚动条来加载数据

    在vuejs中,我们经常使用axios来请求数据,但是有时候,我们请求的数据量很大,那么我们如何实现滑动滚动条来加载数据呢,接下来小编就给大家介绍一下在vuejs中如何实现滑动滚动条来动态加载数据,需要的朋友可以参考下
    2023-10-10
  • Vuex状态机的快速了解与实例应用

    Vuex状态机的快速了解与实例应用

    Vuex是专门为Vuejs应用程序设计的状态管理工具,这篇文章主要给大家介绍了关于Vuex状态机快速了解与实例应用的相关资料,需要的朋友可以参考下
    2021-06-06
  • vue3+elementPlus实现年份选择器

    vue3+elementPlus实现年份选择器

    这篇文章主要为大家详细介绍了vue3如何通过elementPlus实现一个简单的年份选择器,文中的示例代码讲解详细,需要的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • vue日历组件的封装方法

    vue日历组件的封装方法

    这篇文章主要为大家详细介绍了vue封装一个日历组件的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Vue实现自定义右击删除菜单的示例

    Vue实现自定义右击删除菜单的示例

    本文主要介绍了Vue实现自定义右击删除菜单的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02

最新评论