Object.defineProperty()笔记

293 阅读1分钟

总览

let peson = {}
let temp = null
Object.defineProperty(peson,'name',{
    value:'tom', //描述属性值
    writable: true,// 描述属性值是否可以改变,默认为false
    get:function(){},// 描述属性值的getter方法,默认为undefined
    set:function(val){}, //描述属性值的setter方法,默认为undefined
    configurable: true, //描述属性是否配置,以及可否删除,默认为false
    enumerable:true,// 描述属性是否会出现在for in 或者 Object.keys()的遍历中,默认为false
})

writable属性

描述属性值是否可以改变,默认为false。

Object.defineProperty(peson,'name', {
    value:'tom',
})
console.log(peson.name)//tom
//重新配置
Object.defineProperty(peson,'name',{
    value:'li',
})
// 代码报错Cannot redefine property: name at Function.defineProperty 
peson.name = 'li'
console.log(peson.name)//tom

//writable为ture,不管configurable为true还是false属性都可以改变赋值
Object.defineProperty(peson,'name',{
    value:'tom',
    writable: true 
})
console.log(peson.name)//tom
//重新配置
Object.defineProperty(peson,'name',{
    value:'lisa',
    writable: true 
})
console.log(peson.name)//lisa
peson.name = 'li'
console.log(peson.name)//li

get和set

描述属性赋值和取值方法,默认为undefined。

Object.defineProperty(peson,'name',{
    get:function(){
        return temp
    },
    set:function(val){
        temp = val
    }, 
})
peson.name = 'li' 
console.log(peson.name)//li

configurable

描述属性是否配置,以及可否删除,默认为false

Object.defineProperty(peson,'name',{
    value:'tom',
})
//重新配置
Object.defineProperty(peson,'name',{
    value:'li',
})
//代码报错Cannot redefine property: name at Function.defineProperty 
delete peson.name //Cannot delete property 'name' of #<object>

//configurable为ture,不管writable为true还是false属性都可以改变赋值
Object.defineProperty(peson,'name',{
    value:'tom',
    configurable:true,
})
//重新配置
Object.defineProperty(peson,'name',{
    value:'li',
})
console.log(peson.name)//li
delete peson.name
console.log(peson.name)//undefined

enumerable属性

描述属性是否会出现在for in 或者 Object.keys()的遍历中,默认为false

Obiect.defineProperty (peson, "name ,{
    value: "tom",
    enumerable: true,
});
peson.sex ="1";
Object. defineProperty(peson, "age",{
    value: 13, 
    enumerable: false,
});
console.1og(object.keys(peson));//["name","sex"]

for(let key in peson){
    console.1og(key)//name,sex
}

跟直接赋值区别

1

peson.name = 'jie'
等价于
Object.defineProperty(peson,'name',{
    value:'jie', 
    writable: true,
    configurable: true,
    enumerable:true,
})

2

Object.defineProperty(peson,'name',{
    value:'jie', 
})
等价于
Object.defineProperty(peson,'name',{
    value:'jie', 
    writable: false,
    configurable: false,
    enumerable:false,
})

参考地址:www.jianshu.com/p/8fe1382ba…