Object.defineProperty详解

Object.defineProperty()方法在一个对象上增长一个新属性,或者修改一个对象的现有属性的属性描述符,并返回这个对象。数组

语法:函数

Object.defineProperty(obj,prop,descriptor)对象

参数:ip

obj:Object   必须,须要被操做的目标对象。原型链

prop: String  必须,目标对象须要定义或修改的属性的名称。文档

descriptor :String  必须,将被定义或修改的属性的描述符。get

描述:原型

该方法容许精确添加或修改对象的属性的描述符,从而修改属性是否可写、是否可删除、是否可枚举的这些特性。通常状况下,给对象添加属性是经过赋值来建立并显示在属性枚举中,这种方式添加的属性值能够被改变,也能够被删除。而使用Object.defineProperty()则容许改变这些额外细节的默认设置。默认状况下,使用Object.definePropery()增长的属性值是不可改变的。it

对象里目前存在的属性描述符有两种主要形式:数据描述符和访问器描述符。描述符必须是两种形式之一;不能同时是二者。table

数据描述符有如下属性:

  1. 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。

访问器描述符有如下属性:

  1. 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方法来进行处理的。

相关文章
相关标签/搜索