Object.defineProperty()简介
Object.defineProperty() 是一个定义在 Object 构造函数上的方法。从命名就可以看出,此方法用于定义对象的属性。Vue 中就是使用此方法完成数据劫持,并实现双向绑定的。通过对此方法的学习,也为之后熟悉 Vue 双向绑定做准备。
1. 定义
方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
2. 语法
obj : 要在其上定义属性的对象
prop : 要定义或修改的属性的名称
descriptor : 将被定义或修改的属性描述符
返回值 : 被传递给函数的对象
3. 属性描述符
对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符。
数据描述符是一个具有值的属性,该值可能是可写的,也可能不是可写的。
存取描述符是由 getter-setter 函数对描述的属性。
属性描述符只能同时为两个形式中的一个。
4. 属性描述符的键值
把属性本身想象为一个对象,键值参数其实就用于描述该对象的属性。键值共有六个,具有以下表格中的特性。
属性名 | value | get | set | writable | enumerable | configurable |
默认值 | undefined | undefined | undefined | false | false | false |
数据描述符 | Yes | No | No | Yes | Yes | Yes |
存取描述符 | No | Yes | Yes | No | Yes | Yes |
数据描述符独有的两个键值(value, writable)
value : 用于定义属性的值。
writable : 用于描述属性是否可写。
一个很简单的应用 :
当然,当我们不添加 writable 属性时,属性的值将不可修改(默认为 false)
存取描述符独有的两个键值(get, set)
get : 一个给属性提供获取值的方法,该方法返回值被用作属性值。无默认值则返回 undefined。
set : 一个给属性提供设置值的方法。该方法将接受唯一参数,并将该参数的新值分配给该属性。
混合使用两种描述符的键值
当上述两类特有的键值被一起使用时,就违反了描述符本身的定义,出现语法错误。
数据描述符和存取描述符共同具有的键值(configurable, enumerable)
configrable : 描述属性是否配置,以及可否删除。
enumerable : 描述属性是否会出现在 for in 或者 Object.keys()的遍历中。
先对configurable进行分析
有个神奇的特殊情况是,configurable 为 false 时,writable 的值可以从 true 改为 false,反之则不行。
再分析enumerable,可以发现与其定义完全符合。
在以上的使用中,我们又可以发现一个特殊的用法,即直接给对象属性赋值。
当调用 Object.defineProperty()配置属性时,没有赋值的数据描述符取默认值。
当直接对属性赋值时,如以上代码块第二行,则value以外的数据描述符均为 true。
最后更新于