Object.defineProperty()方法在一个对象上增加一个新属性,或者修改一个对象的现有属性的属性描述符,并返回这个对象。
语法:
Object.defineProperty(obj,prop,descriptor)
参数:
obj:Object 必须,需要被操作的目标对象。
prop: String 必须,目标对象需要定义或修改的属性的名称。
descriptor :String 必须,将被定义或修改的属性的描述符。
描述:
该方法允许精确添加或修改对象的属性的描述符,从而修改属性是否可写、是否可删除、是否可枚举的这些特性。一般情况下,给对象添加属性是通过赋值来创建并显示在属性枚举中,这种方式添加的属性值可以被改变,也可以被删除。而使用Object.defineProperty()则允许改变这些额外细节的默认设置。默认情况下,使用Object.definePropery()增加的属性值是不可改变的。
对象里目前存在的属性描述符有两种主要形式:数据描述符和访问器描述符。描述符必须是两种形式之一;不能同时是两者。
数据描述符有以下属性:
- configurable(可配置性)
默认为false。当configurable为false时,enumerable不可以修改,如果修改enumerable则会报错,value和writable可以修改(MDN文档上说configurable特性为false,则其writable特性只能修改为false,亲测,这句是错的),该属性不能被delete从目标对象上删除。当configurable为true时,其他描述符都可以修改,且该属性可以被delete从目标对象上删除。还发现当configurable首先设为true再修改为false,enumerable也是可以修改的
2.enumerable(可枚举性)
默认为false。当writable设置为false时,属性值不能被修改,修改无效,不会报异常。
3.writable(可写性)
默认为false。属性特性 enumerable 定义了对象的属性是否可以在 for...in 循环和 Object.keys() 中被枚举。
4.value(属性值)
默认为false。
访问器描述符有以下属性:
- configurable(可配置性)
默认为false。当configurable为false时,enumerable,set和get都不可以修改,该属性不能被delete从目标对象上删除。当configurable为true时,其他描述符都可以修改,且该属性可以被delete从目标对象上删除。还发现当configurable首先设为true再修改为false,enumerable,set和get也都是可以修改的。
2.enumerable(可枚举性)
默认为false。当writable设置为false时,属性值不能被修改,修改无效,不会报异常。
3.set
在写入属性时调用的函数。默认值为undefined
4.get
在读取属性时调用的函数。默认值为undefined
注意:MDN上说数据描述符和访问器描述符不能相互切换,实际上是configurable为false的情况下才不能相互切换,为true是可以相互切换的。
强调一点,VUE的双向数据绑定就是利用Object.defineProperty()的get和set方法来进行处理的。