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

  • 相关阅读:
    CD4051
    sbit和sfr的定义
    EEPROM与FLASH的区别
    九LWIP学习笔记之最后的战役
    八LWIP学习笔记之用户编程接口(NETCONN)
    七LWIP学习笔记之传输控制协议(TCP)
    六LWIP学习笔记之用户数据报协议(UDP)
    java实现二叉查找树
    线程的锁对象
    MAP
  • 原文地址:https://www.cnblogs.com/mengff/p/9661143.html
Copyright © 2011-2022 走看看