Object.defineProperty详解

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

语法:

Object.defineProperty(obj,prop,descriptor)

参数:

obj:Object   必须,需要被操作的目标对象。

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

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

描述:

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

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

数据描述符有以下属性:

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

原文地址:https://www.cnblogs.com/erduyang/p/7828866.html