• 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

  • 相关阅读:
    MySQL多表查询
    多表关联
    MySQL数据类型 约束
    初识数据库
    socker server和 event
    os 模块 和 os模块下的path模块
    sys 模块
    time 模块
    目录规范

  • 原文地址:https://www.cnblogs.com/mengff/p/9661143.html
Copyright © 2020-2023  润新知