详解js对象中属性的两种类型之数据属性和访问器属性

 更新时间:2023年05月21日 16:26:09   作者:矢心  
在理解vue底层响应式原理时,了解到,原来对象中的属性,不单单从表面看起来那么简单是key:value形式,而是还有隐藏的内部特性,其中对象内的属性分为两种类型的属性:数据属性和访问器属性,本文将给大家详细介绍一下数据属性和访问器属性,需要的朋友可以参考下

前言

在理解vue底层响应式原理时,了解到,原来对象中的属性,不单单从表面看起来那么简单是key:value形式,而是还有隐藏的内部特性

其中对象内的属性 分为两种类型的属性:数据属性访问器属性

ECMAScript 规范中定义:对象是一种无序属性的集合,每个属性都是一个键值对,其中键是字符串或 Symbol 类型,值可以是数据值或访问器函数

其中对象是 有序 还是 无序 的问题,可以移步我的其他的文章参考

这里主要讲到 数据属性访问器属性 是什么,有什么作用

数据属性

数据属性是日常默认使用的类型,就是我们常见的方式

使用 对象字面量 或者 new Object 方式创建

// 对象字面量
const obj = {
  name: '小涛' // 这个name就是数据属性
}
// new Object
const obj2 = new Object({
  name: '小涛'  // 这个name就是数据属性
})

而这个数据属性有以下4个描述其行为的特性。分别是:

[[Configurable]]:是否可配置,该属性是否可以被删除或修改特性,当修改这个特性为false时,不能通过delete删除属性,同时也不能再次修改其他的特性,包括不能改为访问器属性

注意:一旦将属性的 configurable 特性定义为 false ,即不可配置的,该属性就不能再改回可配置的了。此后,再调用 Object.defineProperty() 方法修改除了 writable 特性的特性都会导致错误。(JavaScript 高级程序设计)

[[Enumerable]]:是否可枚举,如果为不可枚举,则不能通过 for-in 循环或者 Object.keys() 返回该属性

[[Writable]]:是否可修改,是否可以修改属性的值

[[Value]]:这个属性的属性值,写入属性值的时候,把值保存在这个位置;读取属性值的时候,从这个位置读。默认值为 undefined

当我们通过 对象字面量 或者 new Object 方式创建的对象时,它们属性的特性默认都为true

当我们通过 Object.defineProperty() 来定义新的属性时,对于没有明确定义的特性,默认为false

下面我通过 Object.defineProperty() 分别演示一下这些特性

[[Configurable]] 是否可配置

const obj = {}

Object.defineProperty(obj, 'name', {
    configurable: false, // 不可配置
    value: '小涛'
})

delete obj.name // 删除无效
console.log(obj, obj.name) // {name: '小涛'} '小涛'

// 除了writable,无法重新配置
Object.defineProperty(obj, 'name', { // 报错: Cannot redefine property: name atFunction.defineProperty
    enumerable: true
})

[[Enumerable]] 是否可枚举

const obj = {}
Object.defineProperty(obj, 'name', {
    enumerable: false, // 不可枚举
    value: '小涛'
})

console.log(obj.name, Object.keys(obj)) // 小涛 []

访问器属性

访问器属性是对象属性中,另外一种类型,在对象中使用 get/set 创建

它也有一下4个描述其行为的特性。分别是:

[[Configurable]]:是否可配置,该属性是否可以被删除或修改特性,当修改这个特性为false时,不能通过delete删除属性,同时也不能再次修改其他的特性,包括不能改为访问器属性

[[Enumerable]]:是否可枚举,如果为不可枚举,则不能通过 for-in 循环或者 Object.keys() 返回该属性

[[Get]]:用于读取属性值的函数。如果该属性没有 getter 函数,则该特性值为 undefined

[[Set]]:用于设置属性值的函数。如果该属性没有 setter 函数,则该特性值为 undefined

在vue2中,正是利用 访问器属性,通过 Object.defineProperty 把对象中的属性 全部转化为访问器属性中的 getter/setter,来实现响应式

可以直接在 对象中使用get/set 或者通过 Object.defineProperty定义get/set 两种方式来使用

对象中使用

const obj = {
  _value: '',
  get value() {
      return this._value
  },
  set value(newVal) {
      this._value = newVal
  }
}

console.log(obj.value)

obj.value即为响应式属性

Object.defineProperty 中使用

const obj = {}
Object.defineProperty(obj, 'value', {
    get() {
        return '小涛测试'
    },
    set(newValue) {
        console.log('获取更新', newValue)
    }
})
obj.value = '1111'

怎么获取属性描述符/特性

如果想要判断对象内属性的特性可以使用**Object.getOwnPropertyDescriptor()Object.getOwnPropertyDescriptors()**获取单个属性或全部属性的 属性描述符/特性

const obj = {}
Object.defineProperty(obj, 'name', {
    enumerable: false, // 不可枚举
    writable: true, // 可修改
    value: '小涛'
})

console.log(Object.getOwnPropertyDescriptor(obj, 'name'))

以上就是详解js对象中属性的两种类型之数据属性喝访问器属性的详细内容,更多关于js 数据属性喝访问器属性的资料请关注脚本之家其它相关文章!

相关文章

  • JS代码计算LocalStorage容量示例详解

    JS代码计算LocalStorage容量示例详解

    这篇文章主要为大家介绍了JS代码计算LocalStorage容量的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • javascript对数组的常用操作代码 数组方法总汇

    javascript对数组的常用操作代码 数组方法总汇

    js下数组也是比较常用的,对数组元素的处理也是有非常多的方法,这里整理了下,需要的朋友可以参考下。
    2011-01-01
  • Js与Jq获取浏览器和对象值的方法

    Js与Jq获取浏览器和对象值的方法

    这篇文章主要介绍了 Js与Jq获取浏览器和对象值的方法的相关资料,需要的朋友可以参考下
    2016-03-03
  • JS实现黑色大气的二级导航菜单效果

    JS实现黑色大气的二级导航菜单效果

    这篇文章主要介绍了JS实现黑色大气的二级导航菜单效果,具有延迟响应鼠标事件显示切换效果的功能,非常简单实用,需要的朋友可以参考下
    2015-09-09
  • JavaScript中立即执行函数实例详解

    JavaScript中立即执行函数实例详解

    javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解。这篇文章主要给大家介绍了关于JavaScript中立即执行函数的相关资料,需要的朋友可以参考下。
    2017-11-11
  • d3.js入门教程之数据绑定详解

    d3.js入门教程之数据绑定详解

    这篇文章主要介绍了关于d3.js数据绑定的相关资料,文中通过示例代码介绍的非常详细,对大家学习只d3.js具有一定的参考价值,需要的朋友下面来一起看看吧。
    2017-04-04
  • JSON 数据详解及实例代码分析

    JSON 数据详解及实例代码分析

    这篇文章主要介绍了JSON 数据详解及实例代码分析的相关资料,需要的朋友可以参考下
    2017-01-01
  • 微信小程序实现图片滚动效果示例

    微信小程序实现图片滚动效果示例

    这篇文章主要介绍了微信小程序实现图片滚动效果,结合实例形式分析了微信小程序基于swiper组件的图片滚动效果相关实现技巧与操作注意事项,需要的朋友可以参考下
    2018-12-12
  • 学习Bootstrap滚动监听 附调用方法

    学习Bootstrap滚动监听 附调用方法

    这篇文章主要为大家全面解析Bootstrap中滚动监听的使用方法,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • JS原生2048小游戏源码分享(全网最新)

    JS原生2048小游戏源码分享(全网最新)

    这篇文章主要介绍了JS原生2048小游戏源码分享,实现代码全部是给予js实现的,代码简单易懂对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05

最新评论