经过Object.defineProperty为对象设置属性,并同时规定属性的属性(可见性,可配置性,可枚举性等)函数
备注:若是经过var obj = {} obj.age = 18这种方式设置的属性,他的可见性,可配置性,可枚举性等都为true,至关于默认设置了本篇讨论的各类属性都为true编码
语法:Object.defineProperty(obj, prop, descriptor)对象
第一个参数:目标对象
第二个参数:须要定义的属性或方法的名字。
第三个参数:目标属性所拥有的特性。(descriptor)ip
descriptor:取值
value:属性的值
writable:若是为false,属性的值就不能被重写,只能为只读了
configurable:总开关,一旦为false,就不能再设置他的(value,writable,configurable)
enumerable:是否能在for...in循环中遍历出来或在Object.keys中列举出来。
get:设置方法
set:获取方法get
备注:Object.getOwnPropertyDescriptor(obj,"name")查看obj对象name属性的属性it
descriptor默认值
var a= {}
Object.defineProperty(a,"b",{
value:123
})
console.log(a.b);//123
只设置了value别的并无设置,它会默认把writable,configurable,enumerable都设置为falseio
configurable 总开关,第一次设置 false 以后,第二次什么设置也不行了console
备注:若是是不可配置,能够把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: btable
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, 赋值不起做用。function
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 注意这里,和个人硬编码相同的