ES5 数据属性描述符和存取描述符

一、数据属性描述符

对象是一个属性集合,对象的基本特征是属性名(name)和属性值(value)。ES5 增加了属性描述符,可以更细腻的控制属性的不同操作。属性描述符有 configurable、writable 和 enumerable。

属性描述符通常和 Object.defineProperty/Object.defineProperties 一起使用来定义属性,它也会受到诸如 Object.freeze/Object.seal 等方法改变。

  1. configurable 当且仅当 configurable 为 true 时,该属性才能够被改变,也能够被删除(delete),默认为 false

javascript;gutter:true; var obj = {}</p> <p>Object.defineProperty(obj, 'name', { value: 'John' }) // 不能 delete delete obj.name // false</p> <p>Object.defineProperty(obj, 'name', { configurable: true, value: 'John' }) // 可以delete delete obj.name // true</p> <pre><code> 2. writable 当且仅当 writable 为 true 时,该属性才能被赋值运算符(=)改变,默认为 false ;gutter:true;
var obj = {}

Object.defineProperty(obj, ‘name’, {
value: ‘John’
})
obj.name = ‘Backus’ // 修改不起作用,仍然是 John,严格模式中会报错阻止修改

Object.defineProperty(obj, ‘name’, {
writable: true,
value: ‘John’
})
obj.name = ‘Backus’ // 被改为了 backus

  1. enumerable 当且仅当 enumerable 为 true 时,该属性才能够出现在对象的枚举属性(for in)中,默认为 false

javascript;gutter:true; var obj = {}</p> <p>Object.defineProperty(obj, 'name', { value: 'John' }) // 不能遍历 for (var a in obj) { console.log(a) // 无输出 }</p> <p>Object.defineProperty(obj, 'name', { enumerable: true, value: 'John' }) // 可以遍历 for (var a in obj) { console.log(a) // 输出 "name" }</p> <pre><code> ES6 的 Object.keys 只返回 enumerable=true 的属性 ;gutter:true;
var obj = {name: ‘John’}

Object.defineProperty(obj, ‘name’, {
value: ‘Backus’,
enumerable: true
})
Object.defineProperty(obj, ‘age’, {
value: 30,
enumerable: false
})

Object.keys(obj) // [‘name’]

可以通过 propertyIsEnumerable 方法判断属性的 enumerable 值

javascript;gutter:true; obj.propertyIsEnumerable('name') // true obj.propertyIsEnumerable('age') // false</p> <pre><code> 4. 使用 ES3(传统的) JSON 方式定义对象,其 configurable/writable/enumerable 默认都是 true,如下 ;gutter:true;
var obj = {name: ‘John’, age: 30}

// configurable
delete obj.name // true
// writable
obj.age = 32 // true
// enumerable
for (var a in obj) {
console.log(a) // age
}

也即

javascript;gutter:true; var obj = {name: 'John', age: 30}</p> <pre><code> 等同于 ;gutter:true;
Object.defineProperty(obj, ‘name’, {
value: ‘John’,
configurable: true,
writable: true,
enumerable: true
})
Object.defineProperty(obj, ‘age’, {
value: 33,
configurable: true,
writable: true,
enumerable: true
})

  1. 使用 ES5 的 Object.defineProperty/Object.defineProperties 方式定义对象,其 configurable/writable/enumerable 默认都是 false,如下

javascript;gutter:true; var obj = {}</p> <p>Object.defineProperty(obj, 'name', { value: 'John' }) Object.defineProperty(obj, 'age', { value: 33 })</p> <p>// configurable delete obj.name // false // writable obj.age = 32 // false // enumerable for (var a in obj) { console.log(a) // 无输出,不能遍历 }</p> <pre><code> 也即 ;gutter:true;
Object.defineProperty(obj, ‘name’, {
value: ‘John’
})

等同于

javascript;gutter:true; Object.defineProperty(obj, 'name', { value: 'John', configurable: false, writable: false, enumerable: false })</p> <pre><code> 数据属性描述符汇总如下 ![ES5 数据属性描述符和存取描述符](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/114013-20160314175248881-1367437520.jpg) ### 二、存取属性描述符 存取描述符是由一对 getter-setter 函数功能来描述的属性,格式为 ;gutter:true;
name: {
get: function() { … },
set: function(newVal) { … },
enumerable: true,
configurable: true
}

例如

javascript;gutter:true; var obj = {}</p> <p>Object.defineProperty(obj, 'name', { configurable: true, enumerable: true, get: function() { console.log('get') return this.value }, set: function(newVal) { console.log('set') this.value = newVal } })</p> <p>// 赋值会调用 set 方法 obj.name = 'John' // 取值会调用 get 方法 obj.name</p> <pre><code> 与上述的属性描述符只能存在一种,即二选一,不能同时存在,否则会报错 ;gutter:true;
var obj = {}

// 错误方式一
Object.defineProperty(obj, ‘name’, {
value: ‘John’,
get: function() {
console.log(‘get’)
return this.value
}
})

// 错误方式二
Object.defineProperty(obj, ‘name’, {
writable: true,
get: function() {
console.log(‘get’)
return this.value
}
})

Firefox 报错如下

ES5 数据属性描述符和存取描述符

存取描述符汇总如下

ES5 数据属性描述符和存取描述符

三、和属性描述符相关的几个函数

  1. Object.defineProperty
  2. Object.defineProperties
  3. Object.getOwnPropertyDescriptor

Object.defineProperty 上面已经介绍过,Object.defineProperties 批量定制对象属性,内部其实循环方式调用 Object.defineProperty

javascript;gutter:true; Object.defineProperties(obj, { name: { value: 'John', writable: true }, age: { value: 30, enmuerable: true } })</p> <pre><code> Object.getOwnPropertyDescriptor 返回该对象某属性的描述器,描述器自身是一个对象 ;gutter:true;
var obj = {}

Object.defineProperty(obj, ‘name’, {
value: ‘Backus’,
writable: true,
enumerable: true
})

var des = Object.getOwnPropertyDescriptor(obj, ‘name’)
console.log(des)

输出如图

ES5 数据属性描述符和存取描述符

Original: https://www.cnblogs.com/snandy/p/5276578.html
Author: snandy
Title: ES5 数据属性描述符和存取描述符

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/553515/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • gin CRUD

    gin CRUD gin CRUD // units package dal //cxg 2022-7-29 import ( "net/url" "…

    技术杂谈 2023年5月30日
    093
  • 高频算法题之数组详细分析

    大家好,我是程序员学长~ 今天给大家带来一篇面试高频算法题之数组的详细解析,全文包含19道大厂笔试面试算法真题,一举拿下数组这个知识点,让算法不在成为进入大厂的绊脚石。 如果喜欢,…

    技术杂谈 2023年7月25日
    093
  • solr查询score机制

    首先,solr使用的是默认的评分机制,要搞明白lucene默认评分机制,需要首先了解一下lucene的查询对象。 1、termquery 2、boolean query 3、ran…

    技术杂谈 2023年5月31日
    092
  • mysql-高可用架构:MHA

    mysql-高可用架构:MHA 1. MHA简介 MHA(Master High Availability)是由日本人yoshinorim开发的一款成熟且开源的MySQL高可用程序…

    技术杂谈 2023年7月11日
    060
  • SQL语句之if,case

    其他函数 、 case 语句 聚合函数max() , min() , avg() , sum() , count () if( bool表达式 , expr1 , expr2 )如…

    技术杂谈 2023年7月25日
    088
  • Java操作HDFS

    Java操作HDFS `java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs….

    技术杂谈 2023年7月11日
    089
  • Vue3 框架基础随笔 (一)

    Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。 Vue可以使用简单的代码实现一个单页面应用。 基本格式 Vue通过模板语法来声明式的将数据渲…

    技术杂谈 2023年7月25日
    063
  • Liunx-CentOS安装Nginx

    0 卸载Nginx 查看nginx是否运行 ps -ef | grep nginx 停止用stop、或者用kill /usr/local/nginx/sbin/nginx -s s…

    技术杂谈 2023年6月21日
    0102
  • 除了影响因子 还有哪些指标可以评价论文的价值

    除了影响因子,还有哪些指标可以评价论文的价值?一提起论文价值,恐怕首先想到的是影响因子。尤其是在中国,影响因子对于科研人员和工作者真是命根,晋级,升迁,申请基金,评奖等等无不与影响…

    技术杂谈 2023年5月31日
    0103
  • 51单片机——蓝牙远程点灯

    一、HC-05蓝牙模块 HC-05是主从一体的蓝牙串口模块,使用起来非常之方便,当HC-05与其他蓝牙设备连接成功后,使用方法与串口没什么差别,当然HC-05要跟你的单片机串口连接…

    技术杂谈 2023年5月31日
    078
  • DelayQueue详解

    DelayQueue介绍 【1】DelayQueue 是一个支持延时获取元素的阻塞队列, 内部采用优先队列 PriorityQueue 存储元素,同时元素必须实现 Delayed …

    技术杂谈 2023年7月24日
    078
  • 什么是CLI?

    命令行界面(英语:command-line interface,缩写]:CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接…

    技术杂谈 2023年5月31日
    091
  • IE10/11克隆textarea时 bug

    重现代码 html;gutter:true; var ta= document.createElement('textarea') ta.placeholder…

    技术杂谈 2023年6月1日
    088
  • 古传拳经拳法秘要

    《古传拳经拳法秘要》(手抄本) 国术馆 2022-05-05 18:33 更多珍贵拳谱资料 关注公众号”老拳谱” 勿使前辈之遗珍失于我手 点击图片了解与报名…

    技术杂谈 2023年5月31日
    075
  • Python-装饰器的入门讲解

    小白在学习装饰器时,会遇到一些地方不太理解或者不太清楚,这是因为一开始你就直接撸装饰器的缘故,那么怎样才能将装饰器理解并且弄懂呢?所以在学装饰器之前必须要弄懂函数的嵌套以及闭包,接…

    技术杂谈 2023年7月25日
    080
  • 白帽专访丨大家好,我是王老师,Day1安全团队的创始人

    白帽江湖人才辈出,传奇人物不胜枚举,这里只用实力说话,也许你没见过大佬真容,但ta的”传说”或许早有耳闻~ Xrayteam安全团队的xxxeyJ:&#82…

    技术杂谈 2023年5月31日
    0104
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球