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

  • 相关阅读:
    .charAt()方法
    CustomerBiz方法运用
    面向对象_方法 判断
    方法
    查找无序数组索引
    面向对象_购票
    创建类 方法 构建类对象
    StringBuffer 方法
    docker创建redis mysql 等服务
    docker常用的命令
  • 原文地址:https://www.cnblogs.com/erduyang/p/7828866.html
Copyright © 2020-2023  润新知