当前位置 博文首页 > 纸飞机博客:object.defineProperty

    纸飞机博客:object.defineProperty

    作者:[db:作者] 时间:2021-09-07 10:08

    Object.defineProperty()?方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。

    Object.defineProperty(obj,prop,descriptor)

    obj:必需。目标对象

    prop:必需。需定义或修改的属性的名字

    descriptor:必需。属性描述符。内部值。

    返回:传入函数的对象。即第一个参数obj

    Object.getOwnPropertyDescriptor(obj,prop) 查看属性的描述符

    ?属性描述符:属性的各种特征。

    configurable:属性是否可以通过delete 被删除。或特性是否能修改。

    enumerable:属性是否可以被for..in或 Object, keys 遍历。

    writable:属性的数据值是否可以修改。

    value:属性的数据值。读取和写入属性值 时的存放位置。默认值为undefined。

    get:当读取属性时调用的方法。默认值为 undefined。

    set:当写入属性时调用的方法。默认值为 undefined。

    js属性分为如下两种:

    1 .数据属性

    包含数据值,其描述符有configurable, enumerable,writable,value 四个。

    //可在对象上直接定义数据属性或修改其数据值。其configurable, enumerable, writable默认值为true。但修改其他属性特性需用defineProperty。
    var obj = {};
    obj.a = 1;
    obj.a = 2;//修改值
    console.log(
    Object.getOwnPropertyDescriptor(obj, "a"));
    //{configurable: true,enumerable: true,value: 2,writable: true,__proto__: Object}
    //修改其writable为不可改写
    Object.defineProperty(obj,"a",{
        writable: false
    })
    console.log(obj.a); // 2
    obj.a = 3
    console.log(obj.a);//2 仍然是2,所以改写不成功
    也可通过defineProperty定义数据属性。其configurable, enumerable, writable不设置默认值为false。
    Object.defineProperty(obj, "b",{
        value: 1
    });
    console.log(Object.getOwnPropertyDescriptor(obj, "b"));
    //{configurable: false,enumerable: false,value: 1,writable: false,__proto__: Object}
    obj.b = 2
    console.log(obj.b) // 1 (writable为false无法改写)
    Object.defineProperty(obj, "b", {
        writable: true
    })
    // Uncaught TypeError: Cannot redefine property: b (报错,configurable为false,无法重新修改特性) 

    2 .访问器属性

    不包含数据值。描述符有configurable, enumerable,get,set四个,不能再同时拥 有writable 或 value。

    无法直接在对象上定义,需通过defineProperty 设置 configurable ,enumerable 默认为 false
    var user = {
        name: 'xiao'
    };
    var count = 12;
    //定义访问器属性age
    Object.defineProperty(user,age,{
        get: function(){
            return count;
        },
        set: function(newVal){
            count = newVal + 1;
        }
    })
    console.log(user.age); //12 (意为调用get)
    user.age = 42;//(意为调用set)
    console.log(user.age); //43
    console.log(Object.getOwnPropertyDescriptor(user, "age"));
    //{ I
        configurable: false
        enumerable: false
        get: f()
        set: f(newVal)
        __proto__: Object
    }
    属性必须为数据属性或访问器属性之一,不能同时是两者。writable/value是数据属性的描符,get/set是访问器属性的描述符,无法同时设置。
    Object.defineProperty(user,like,{
        value: 'eat',
        get: function() {
            return 1;
        )
    });
    // Uncaught TypeError: Invalid property descriptor.Cannot both specify accessors and a value or writable attribute
    
    
     -------------
    
    user.height = 174 // 数据属性
    console.log(Object.getOwnPropertyDescriptor(user, "height"));
    //{
        configurable: true,
        enumerable: true,
        value: 174,
        writable: true,
        __proto__: Object
    }
    //设置get描述符后,value值没了,成为访问器属性
    Object.defineProperty(user,height,{
        get: function() { i
            return 1;
        }
    }) I
    console.log(Object.getOwnPropertyDescriptor(user, "height"));
    {
        configurable: true
        enumerable: true
        get: f ()
        set: undefined
        __proto__: Object
    }

    cs
    下一篇:没有了