在网上搜索关于Object.defineProperty()的文章,说的有的很详细,但是感觉都太复杂了,我来用最简单的描述讲一下吧
Object.defineProperty()是为对象添加属性的方法,并且添加的属性可以控制(删,改,查)=》(删除、修改、枚举)
用法
Object.defineProperty(obj,name,{
在这写属性描述
})
obj
就是你想为其增加属性的对象
name
你想增加的属性名
{
}
你增加的属性描述:这里边一共有六个值
1、value(设置的属性值、注意不能与2、3、同时使用)
2.get(是个函数,返回值就是你想设置的属性值)
3.set(是个函数、修改你设置的属性值)
4.writable:(布尔值,是否可修改设置的属性值,默认false;不能与 3 同时使用)
5.enumerable:(布尔值 是否可枚举,默认false)
6 configurable:(布尔值 是否可删除 默认false)
示例
1.通过value设置属性值
var a={}
Object.defineProperty(a,'name',{
value:'菜鸟'
})
console.log(a) //{name:‘菜鸟’}
console.log(a.name) //菜鸟
a.name='牛人'
console.log(a) //{name:‘菜鸟’}
console.log(a.name) //菜鸟
发现没变也没报错 是的,因为没有设置writable,所以writable默认false;不可修改,你可以自己尝试一下
*
1.当writable为true configurable为false时,可以通过a.name='菜鸟'的方式赋值也可以通过Object.defineProperty(a,'name',{})方式赋值
2.当writable为false configurable为false时 不可进行重新赋值,Object.defineProperty(a,'name',{})方式赋值会报错 自己试
2.当writable为false configurable为true时 可通过Object.defineProperty(a,'name',{})方式赋值
*
2.通过set 和get设置和获取属性值
let a={}
let val
Object.defineProperty(a,'name',{
get(){
return val
},
set(va){
val=va
}
})
console.log(a) // {}
console.log(a.name) // undefined
a.name='菜鸟' =》这样设置值-> 调用setter
console.log(a) // {}
console.log(a.name) // 菜鸟
看出和value的区别了吗,及时设置了属性,打印的时候也打印不出来的
结语
我这只是快速交给你使用和理解,想深入探究可以去看《你不知道的javascript》