Js中的Object.defineProperty
Posted 413Xiaol
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Js中的Object.defineProperty相关的知识,希望对你有一定的参考价值。
通过Object.defineProperty为对象设置属性,并同时规定属性的属性(可见性,可配置性,可枚举性等)
备注:如果通过var obj = {} obj.age = 18这种方式设置的属性,他的可见性,可配置性,可枚举性等都为true,相当于默认设置了本篇讨论的各种属性都为true
语法:Object.defineProperty(obj, prop, descriptor)
第一个参数:目标对象
第二个参数:需要定义的属性或方法的名字。
第三个参数:目标属性所拥有的特性。(descriptor)
descriptor:取值
value:属性的值
writable:如果为false,属性的值就不能被重写,只能为只读了
configurable:总开关,一旦为false,就不能再设置他的(value,writable,configurable)
enumerable:是否能在for...in循环中遍历出来或在Object.keys中列举出来。
get:设置方法
set:获取方法
descriptor默认值
var a= {}
Object.defineProperty(a,"b",{
value:123
})
console.log(a.b);//123
只设置了value别的并没有设置,它会默认把writable,configurable,enumerable都设置为false
configurable 总开关,第一次设置 false 之后,第二次什么设置也不行了
备注:如果是不可配置,可以把writable由true改为false但不能从false改为true
var a= {}
Object.defineProperty(a,"b",{
configurable:false
})
Object.defineProperty(a,"b",{
configurable:true
})
//error: Uncaught TypeError: Cannot redefine property: b
writable 如果设置为fasle,就变成只读了。。
var a = {};
Object.defineProperty(a, "b", {
value : 123,
writable : false
});
console.log(a.b); // 打印 37
a.b = 25; // 没有错误抛出(在严格模式下会抛出)
console.log(a.b); // 打印 37, 赋值不起作用。
enumerable 定义了对象的属性是否可以在 for...in 循环和 Object.keys() 中被枚举。
var a= {}
Object.defineProperty(a,"b",{
value:3445,
enumerable:true
})
console.log(Object.keys(a)); // 打印["b"]
改为false
var a= {}
Object.defineProperty(a,"b",{
value:3445,
enumerable:false
})
console.log(Object.keys(a));// 打印[]
set和get 赋值 或者 取值的时候会分别触发 set 和 get 对应的函数
注:1.不能同时设置get和set与wriable或value,就是说想用get和set,就不能用wriable或value中的任何一个
2.通过obj={} 这种形式去定义get/set方法的时候,和这里不太一样
a.get/set和函数之间不需要冒号,例如obj={get name(){return "xiaol"}}
var a= {}
Object.defineProperty(a,"b",{
set:function(newValue){
console.log("你要赋值给我,我的新值是"+newValue)
},
get:function(){
console.log("你取我的值")
return 2 //注意这里,我硬编码返回2
}
})
a.b =1 //打印 你要赋值给我,我的新值是1
console.log(a.b) //打印 你取我的值
//打印 2 注意这里,和我的硬编码相同的
以上是关于Js中的Object.defineProperty的主要内容,如果未能解决你的问题,请参考以下文章
Object.defineProperty() 以及 vue 中双数据绑定的底层原理