Object.defineProperty

发布时间 2023-09-22 15:59:12作者: 勋勋的大宝贝

语法:Object.defineProperty(obj,property,descriptor)

Object.defineProperty() 静态方法会直接在一个对象上定义一个新属性,或修改其现有属性,并返回此对象。

基本用法

let obj_test = {
    name:'abc'
};
Object.defineProperty(obj_test, "age", {
    // value:18,
    // writable:true,
    enumerable:true,
    configurable:true,
    set:function(new_age){
        console.log('设置age属性...')
        num = new_age+1;
    },
    get:function(){
        console.log('读取age属性...')
        return num;
    }
})

console.log(obj_test)   //{ name: 'abc', age: [Getter/Setter] }
obj_test.age = 10   //设置age属性...
//读取age属性...
//11
console.log(obj_test.age)

 

使用Object.defineProperty() 定义对象属性时,如已设置 set 或 get, 就不能设置 writable 和 value 中的任何一个了。TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute, #<Object>

https://www.cnblogs.com/lifengjuan/p/17722573.html

 

enumerable的用法:当设置enumerable:false时,遍历其key值是遍历不到的

let obj_test = {
    name:'abc'
};
Object.defineProperty(obj_test, "age", {
    value:18,
    enumerable:false
})

Object.defineProperty(obj_test, "sex", {
    value: 18,
    enumerable: true
})

console.log(Object.keys(obj_test))  //[ 'name', 'sex' ]

 

 

参数

  • obj

    要定义属性的对象。

  • prop

    一个字符串或 Symbol,指定了要定义或修改的属性键。

  • descriptor

    要定义或修改的属性的描述符,且此参数本身为一个对象

    • 属性值1:value 设置属性默认值

    • 属性值2:writable 设置属性是否能够修改。控制属性是否可以被修改,默认值是false

    • 属性值3:enumerable 设置属性是否可以枚举,即是否允许遍历。控制属性是否可以枚举,默认值是false

    • 属性值4:configurable 设置属性是否可以删除或编辑。控制属性是否可以被删除,默认值是false

    • 属性值5:get 获取属性的值

    • 属性值6:set 设置属性的值

返回值

传入函数的对象,其指定的属性已被添加或修改。