输出是什么?

const person = { name: "Lydia" };Object.defineProperty(person, "age", { value: 21 });console.log(person);
console.log(Object.keys(person));

A: { name: “Lydia”, age: 21 }, [“name”, “age”]
B: { name: “Lydia”, age: 21 }, [“name”]
C: { name: “Lydia”}, [“name”, “age”]
D: { name: “Lydia”}, [“age”]

答案: B

通过defineProperty方法,我们可以给对象添加一个新属性,或者修改已经存在的属性。而我们使用defineProperty方法给对象添加了一个属性之后,属性默认为 不可枚举(not enumerable). Object.keys方法仅返回对象中 可枚举(enumerable) 的属性,因此只剩下了"name".

用defineProperty方法添加的属性默认不可变。你可以通过writable, configurable 和 enumerable属性来改变这一行为。这样的话, 相比于自己添加的属性,defineProperty方法添加的属性有了更多的控制权。

普通的对象属性对应的属性描述符含有:writable(可写)、enumerable(可枚举)和configurable(可配置)。

1.在使用Object.defineProperty()、Object.defineProperties() 或 Object.create() 函数的情况下添加数据属性,writable、enumerable和configurable默认值为false。

2.使用对象直接量创建的属性,writable、enumerable和configurable特性默认为true。

writable

writable属性是一个布尔值,决定了目标属性的值(value)是否可以被改变。如果原型对象的某个属性的writable为false,那么子对象将无法自定义这个属性。

enumerable

enumerable(可遍历性)返回一个布尔值,表示目标属性在 for…in、Object.keys、JSON.stringify 中是否可遍历。但是可以直接获取它的值。
注意,for…in循环包括继承的属性,Object.keys方法不包括继承的属性。如果需要获取对象自身的所有属性,不管是否可遍历,可以使用Object.getOwnPropertyNames方法。

configurable

configurable(可配置性)返回一个布尔值,决定了是否可以修改属性描述对象。
也就是说,configurable为false时,value、writable、enumerable和configurable都不能被修改了, configurable修改成false是单向操作,无法撤销!以及无法被删除
注意,writable只有在false改为true会报错,true改为false是允许的。
至于value,只要writable和configurable有一个为true,就允许改动。
另外,configurable为false时,直接目标属性赋值,不报错,但不会成功。

JS对象属性writable、enumerable、configurable相关推荐

  1. php json 遍历 keys,详解javascript遍历json对象的key和任意js对象属性的示例代码(图)...

    下面小编就为大家带来一篇javascript遍历json对象的key和任意js对象属性实例.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 使用 keys 方法获取该对象 ...

  2. JS 对象属性的两种表示方法

    JS中对象属性的表示方法有两种: <prop为属性名> obj.prop obj['prop'](注:'[]'里面必须是字符串) 例: var obj = {name:'abc' } ob ...

  3. JavaScript对象详解,js对象属性的添加

    目录 一,什么是对象? 二,创建一个对象 三,对象的嵌套 四,对象的属性与修改 1,使用点.运算符 2,使用[]符号 3,修改属性 五,给对象添加属性 六,查看与删除对象的属性 1,使用Object. ...

  4. 深入 JS 对象属性

    译者:前端小智作者:Dr.Axe l来源:2ality 阿里云最近在做活动,低至2折,有兴趣可以看看: https://promotion.aliyun.com/ntms/yunparter/invi ...

  5. html下拉框属性js,Html下拉框Js对象属性方法总结

    var obj = document.getElementById("selectId"); 一 select属性: length ----------> 顾名思义字指的是下 ...

  6. js 对象属性过滤方法

    数组使用fliter 函数是可以过滤掉的,但是对象的属性怎么过滤呢? 剔除少数属性,要多数属性 有时候需要剔除少数属性,留下大多数.类似于TS的omit 例子: let person = {name: ...

  7. react,删除js对象属性

    const { data, setData } = useState()const XXX = ( id ) => {request({url: 'XXX',method: 'post',dat ...

  8. js for in遍历对象_JS中轻松遍历对象属性的几种方式

    自身可枚举属性 Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 .如果对象的键-值都 ...

  9. [转] js对象监听实现

    前言 随着前端交互复杂度的提升,各类框架如angular,react,vue等也层出不穷,这些框架一个比较重要的技术点就是数据绑定.数据的监听有较多的实现方案,本文将粗略的描述一番,并对其中一个兼容性 ...

最新文章

  1. 厉害了,史上最 “污” 技术解读。。
  2. “蜥蜴之尾”——长老木马四代分析报告
  3. RabbitMQ管理(5)——集群管理
  4. 服务器系统gho系统怎么安装系统,GHOST怎么重装系统?GHO文件安装系统教程
  5. 【Baltic2003】【BZOJ1370】Gang团伙(并查集,拆点)
  6. 定时器开始时延时了十几秒_第六章--系统滴答定时器
  7. CISCO技术(1.7万)
  8. 【渝粤题库】陕西师范大学200081中国古代文学(一)作业(高起本、高起专)
  9. 【Grafana】通过阿里云日志服务监控Nginx访问日志显示统计信息
  10. 2012server改计算机用户名,windows server 2012 r2管理员用户名怎么修改
  11. mysql数据库如何查看表空间_MYSQL:查看的数据库表空间
  12. Nuxt.js 如何做SEO优化
  13. 书单 | 测试工程师必读经典好书,你读过几本?
  14. 建立个人的腾讯云服务器
  15. HTML5 移动页面自适应手机屏幕四种方法(禁止html5手机端双击页面放大的问题)
  16. 计算机科学与技术专业考研方向
  17. h5调用指纹识别_基于HTML Canvas实现“指纹识别”技术,canvas指纹
  18. TiDB at ZaloPay Infrastructure Lesson Learned
  19. 回归算法-线性回归分析-过拟合欠拟合岭回归
  20. 全球地名中英文对照表(B)

热门文章

  1. 分享一下嵌入式 HarmonyOS 的学习思路
  2. nodejs是单线程还是多线程_node是多线程还是单线程?
  3. 巨蟹座适合学计算机嘛,几号出生的巨蟹座最厉害 最聪明 命好
  4. kesci---2019大数据挑战赛预选赛---情感分析
  5. kali 安装php7.3-fpm或者其他版本的php
  6. Go map的底层原理(存储、扩容)
  7. RocketMQ学习笔记
  8. Word 邮件合并功能(Excel表中指定列数据插入到Word模板指定位置,批量生成Word)
  9. css发动机的机滤,别傻了!网传的机油滤清器加磁铁真的能起到发动机保护作用?...
  10. solidworks安装出错,Error 1935.安装程序集出错