Object.defineProperty()方法在一个对象上增长一个新属性,或者修改一个对象的现有属性的属性描述符,并返回这个对象。数组
语法:函数
Object.defineProperty(obj,prop,descriptor)对象
参数:ip
obj:Object 必须,须要被操做的目标对象。原型链
prop: String 必须,目标对象须要定义或修改的属性的名称。文档
descriptor :String 必须,将被定义或修改的属性的描述符。get
描述:原型
该方法容许精确添加或修改对象的属性的描述符,从而修改属性是否可写、是否可删除、是否可枚举的这些特性。通常状况下,给对象添加属性是经过赋值来建立并显示在属性枚举中,这种方式添加的属性值能够被改变,也能够被删除。而使用Object.defineProperty()则容许改变这些额外细节的默认设置。默认状况下,使用Object.definePropery()增长的属性值是不可改变的。it
对象里目前存在的属性描述符有两种主要形式:数据描述符和访问器描述符。描述符必须是两种形式之一;不能同时是二者。table
数据描述符有如下属性:
默认为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。
访问器描述符有如下属性:
默认为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方法来进行处理的。