为JavaScript对象新增或者修改属性,有两种不同方式:直接使用=赋值或者使用Object.defineProperty 定义,使用后者的话还可以设置属性的描述符。

Object.defineProperty

Object.defineProperty(obj, prop, descriptor) 接受三个参数:

  1. obj:要在其上定义属性的对象。
  2. prop:要定义或修改的属性的名称。
  3. descriptor:将被定义或修改的属性描述符。

属性描述符

属性描述符是一个对象,作用就是定义一个属性的属性 (-,-)。他有两种主要形式:数据描述符和存取描述符。

数据描述符是一个具有值的属性,该值可能是可写的,也可能不是可写的,特有属性:value、writable。存取描述符是由getter-setter函数对描述的属性,特有属性:get、set。描述符必须是这两种形式之一;不能同时是两者。

Object.getOwnPropertyDescriptor() 可以获取指定对象上一个自有属性对应的属性描述符。




数据描述符和存取描述符均具有以下可选键值:

1. configurable

表示对象的该属性是否可以被删除,以及其他特性是否可以被修改(除了可以单向改变 writable 为 false)。默认为 false。

let Tom = {}
Object.defineProperty(Tom, 'height', {
value: 174
})
delete Tom.height
console.log(Tom) // {height: 174}
let Tom = {}
Object.defineProperty(Tom, 'height', {
value: 174,
configurable: true
})
delete Tom.height
console.log(Tom) // {}

2. enumerable

当定义了对象的属性是否可以在 for...in 循环和 Object.keys() 中被枚举。默认为 false。

let Tom = {}
Object.defineProperty(Tom, 'height', {
value: 174
})
Object.keys(Tom) // []
let Tom = {}
Object.defineProperty(Tom, 'height', {
value: 174,
enumerable: true
})
Object.keys(Tom) // ["height"]






数据描述符具有以下可选键值:

1. value

该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。

2. writable

当且仅当该属性的writable为true时,value才能被赋值运算符 “=” 改变。默认为 false。

let Tom = {}
Object.defineProperty(Tom, 'height', {
value: 174
})
Tom.height = 180
console.log(Tom) // {height: 174} Object.getOwnPropertyDescriptor(Tom,'height')
// {value: 174, writable: false, enumerable: false, configurable: false}
let Tom = {}
Object.defineProperty(Tom, 'height', {
value: 174,
writable: true
})
Tom.height = 180
console.log(Tom) // {height: 180}

使用“=”定义属性时,writable/enumerable/configurable 都为true:

let Tom = {}
Tom.height = 174 Object.getOwnPropertyDescriptor(Tom,'height')
// {value: 180, writable: true, enumerable: true, configurable: true}

存取描述符同时具有以下可选键值:

1. get

一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this对象(由于继承关系,这里的this并不一定是定义该属性的对象)。

2. set

一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。

let Tom = {
realHeight: 173
} Object.defineProperty(Tom, 'height', {
get: function() {
console.log('报高一点')
return this.realHeight + 5;
},
set: function(value) {
console.log('现在高' + value + 'cm')
this.realHeight = value
}
}) Object.getOwnPropertyDescriptor(Tom,'height')
// {get: ƒ, set: ƒ, enumerable: false, configurable: false} Tom.height // 178
Tom.height = 169
Tom.height // 174

Object.defineProperty 与 属性描述符的更多相关文章

  1. JS属性描述符之Object.defineProperty()定义对象属性特性

    一.Object.defineProperty的作用 用来给对象新增属性,和修改对象中的属性. 二.JS对象中的描述符 js对象中两种属性描述符:数据描述符和存取描述符(访问描述符). 注意事项: 1 ...

  2. 深入理解javascript对象系列第三篇——神秘的属性描述符

    × 目录 [1]类型 [2]方法 [3]详述[4]状态 前面的话 对于操作系统中的文件,我们可以驾轻就熟将其设置为只读.隐藏.系统文件或普通文件.于对象来说,属性描述符提供类似的功能,用来描述对象的值 ...

  3. JavaScript 属性描述符

    属性描述符(Property Descriptor)是 ES5 之后出现的概念,顾名思义,它用于描述属性应该是什么样,例如是否只读,能否枚举,能否可配置等.所有对象属性均可使用属性描述符来定义. 属性 ...

  4. JS属性描述符

    var myObject = { a:2 }; Object.getOwnpropertyDescriptor(myObject,"a"); { value:2, writable ...

  5. JS - 属性描述符各配置的默认值的注意事项

    通过字面量或者obj.x = 1;创建的属性 与 通过Object.defineProperty创建的属性,他们的属性描述符的默认值是不同的,前者都为true,后者都为false.

  6. js 面向对象之属性描述符

    上回介绍了面向对象之构造器属性.这次介绍下属性描述符 遍历对象属性 let person = {name: "lisi"} for (key in person) { consol ...

  7. JavaScript.descriptor(属性描述符)

    属性描述符是对JavaScript属性的描述,包括:value.writable.enumerable.configurable,除value其他默认为true. 本文包括: 取得属性描述符. Obj ...

  8. vue2.x版本中Object.defineProperty对象属性监听和关联

    前言 在vue2.x版本官方文档中 深入响应式原理 https://cn.vuejs.org/v2/guide/reactivity.html一文的解释当中,Object.defineProperty ...

  9. Python:高级主题之(属性取值和赋值过程、属性描述符、装饰器)

    Python:高级主题之(属性取值和赋值过程.属性描述符.装饰器) 背景 学习了Javascript才知道原来属性的取值和赋值操作访问的“位置”可能不同.还有词法作用域这个东西,这也是我学习任何一门语 ...

随机推荐

  1. php面试全套

    7.mvc是什么?相互间有什么关系? 答:mvc是一种开发模式,主要分为三部分:m(model),也就是模型,负责数据的操作;v(view),也就是视图,负责前后台的显示;c(controller), ...

  2. 最全NB-IoT/eMTC物联网解决方案名录汇总

    NB-IoT/eMTC等蜂窝物联网技术的成熟和商用,占据低功耗广域网络(LPWAN)的主流地位,推动全球物联网新一轮发展热潮,越来越多的行业开始采用物联网方案来解决解决实际问题.实现落地应用,越来越多 ...

  3. lintcode-141-x的平方根

    141-x的平方根 实现 int sqrt(int x) 函数,计算并返回 x 的平方根. 样例 sqrt(3) = 1 sqrt(4) = 2 sqrt(5) = 2 sqrt(10) = 3 挑战 ...

  4. VMbox复制虚拟机后网卡问题-bring up interface eth0:Device eth0 does not seem to be present

    1.使用 ifconfig -a 查看mac地址 eg:HWaddr:08:00:29:B2:2B   2.vi /etc/sysconfig/network-scripts/ifcfg-eth0 将 ...

  5. Visual Studio 数据库架构比较

      一.前言 开发的时候在测试服务器上和线网服务器上面都有我们的数据库,当我们在线网上面修改或者新增一些字段后,线网的数据库也需要更新,这个时候根据表的修改记录,然后在线网上面一个一个增加修改很浪费效 ...

  6. xpath获取块元素下<br>下的信息

    再爬虫取字段的时候遇到一种类似下面的结构: <p> <br> "通用名称:xxxxxx" </p> 用xpath取的方式://p//text() ...

  7. bzoj3546[ONTAK2010]Life of the Party

    题意是裸的二分图关键点(必然在二分图最大匹配中出现的点).比较经典的做法在cyb15年的论文里有: 前几天写jzoj5007的时候脑补了一种基于最小割可行边的做法:考虑用最大流求解二分图匹配.如果某个 ...

  8. [洛谷P3224][HNOI2012]永无乡

    题目大意:给你$n$个点,每个点有权值$k$,现有两种操作: 1. $B\;x\;y:$将$x,y$所在联通块合并2. $Q\;x\;k:$查询第$x$个点所在联通块权值第$k$小是哪个数 题解:线段 ...

  9. POJ1279:Art Gallery——题解

    http://poj.org/problem?id=1279 题目大意:给按照顺时针序的多边形顶点,问其内核可行区域面积. —————————————————————————————— 终于变了一点… ...

  10. POJ3057:Evacuation——题解

    http://poj.org/problem?id=3057 题目大意: .为人,D为门,X为障碍,门每秒只能出去一个人,问多少秒出光. 如果无法出光输出impossible. ——————————— ...