第一:value
value:值,//实际存储属性值
第二:writable
writable:true,//控制值(value)是否可修改,默认是true可修改的
第三:enumerable:true
enumerable:true,//控制是否可用for in遍历到默认是true,即使不能for in,用"."也能访问
第四:configurable //控制是否可以修改其他特性,是否可以删除属性,修改不可逆转默认是true;
其实 即使为false,在writable为true的情况下,它的特性值是可以改成false的
如何访问:
1:获取一个对象的属性的四大特性:
Object.getOwnPropertyDescritor(obj,"属性名");
2:修改一个对象的属性的四大特性:
Object.defineProperty(obj,"属性名",{
特性名:特性值,
...
})
Object.defineProperty(obj,"_shuxing",{
set(v){
},
get(a){}
}
}
function func(){
var a=3;
Object.defineProperty(obj,"_属性名",{
set(v){
},
get(a){}
}
}
3:同时修改多个属性的四大特性
Object.defineProperties(obj,{
属性名:{
特性名:特性值,
...
},
属性名:{
特性名:特性值,
...
},
})
优化后:防止在对象创建,修改对象的结构/内容,强调:必须启用严格模式才能报错!
3个级别
1、防扩展:禁止给对象添加任何新属性
Object.preventExtensions(obj);
2、密封:seal 在防扩展的基础上,再禁止删除现有属性,即不能添加,又不能删除
相当于将所有属性的configurable特性都设置为false,删除不存在的不报错
Object.seal(obj);
3、冻结:禁止给对象做任何修改(包括结构和值)
Object.freeze(obj);
三件事:
1、禁止扩展
2、修改所有属性的configurable特性为false
3、修改所有属性的writable特性为false