zoukankan      html  css  js  c++  java
  • Object.defineProperty基本用法

    1. 基本形式

    Object.defineProperty(obj,prop,descriptor)

    参数说明:

    obj: 必需,目标对象
    prop: 必需,需定义或修改属性的名字
    descriptor: 必需,目标属性所拥有的特性

    2. descriptor的基本机构

    {
        value: 任意类型的值,
        configurable: true | false,   //属性是否可以被delete,或者再次修改descriptor
        enumerable: true | false,     //属性是否可以被for...in,Object.keys()枚举
        writable: true | false,       //对象是否可被赋值
        get:function(){} | undefined, 
        set:function(){} | undefined
    }

    get,set方法不能与writable或value一起使用

    3. configurable详细说明

    是否可以删除目标属性或是否可以再次修改属性的特性(writable, configurable, enumerable)。设置为true可以被删除或可以重新设置特性;设置为false,不能被可以被删除或不可以重新设置特性。默认为false。

    这个属性起到两个作用:

    目标属性是否可以使用delete删除
    目标属性是否可以再次设置特性

    例如:

    //-----------------测试目标属性是否能被删除------------------------
    var obj = {}
    //第一种情况:configurable设置为false,不能被删除。
    Object.defineProperty(obj,"newKey",{
        value:"hello",
        writable:false,
        enumerable:false,
        configurable:false
    });
    //删除属性
    delete obj.newKey;
    console.log( obj.newKey ); //hello
    
    //第二种情况:configurable设置为true,可以被删除。
    Object.defineProperty(obj,"newKey",{
        value:"hello",
        writable:false,
        enumerable:false,
        configurable:true
    });
    //删除属性
    delete obj.newKey;
    console.log( obj.newKey ); //undefined
    
    //-----------------测试是否可以再次修改特性------------------------
    var obj = {}
    //第一种情况:configurable设置为false,不能再次修改特性。
    Object.defineProperty(obj,"newKey",{
        value:"hello",
        writable:false,
        enumerable:false,
        configurable:false
    });
    
    //重新修改特性
    Object.defineProperty(obj,"newKey",{
        value:"hello",
        writable:true,
        enumerable:true,
        configurable:true
    });
    console.log( obj.newKey ); //报错:Uncaught TypeError: Cannot redefine property: newKey
    
    //第二种情况:configurable设置为true,可以再次修改特性。
    Object.defineProperty(obj,"newKey",{
        value:"hello",
        writable:false,
        enumerable:false,
        configurable:true
    });
    
    //重新修改特性
    Object.defineProperty(obj,"newKey",{
        value:"hello",
        writable:true,
        enumerable:true,
        configurable:true
    });
    console.log( obj.newKey ); //hello

    4. 对象已有的属性可以修改descriptor,设置其为不可写或不可枚举
    5. 使用Object.defineProperty添加属性,若不设置descriptor,则会采用默认值,configurable,enumerable,writable均为false

    参考:https://segmentfault.com/a/1190000007434923

  • 相关阅读:
    Laravel自定义分页样式
    mysql中 key 、primary key 、unique key 和 index 有什么不同
    PHP RSA公私钥的理解和示例说明
    PHP操作Excel – PHPExcel 基本用法
    Yii 1.1 常规框架部署和配置
    阿里云服务器 Ubuntu 安装 LNMP
    全国地区sql表
    十道海量数据处理面试题与十个方法大总结
    Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别
    乐观锁与悲观锁——解决并发问题
  • 原文地址:https://www.cnblogs.com/mengff/p/9661143.html
Copyright © 2011-2022 走看看