李权20200917
对象的保护
1.为什么使用对象的保护?
因为js的对象中,毫无自保能力,随时可以添加和删除属性,随时可以修改属性
2.什么时候使用对象的保护?
当我们想要我们创建的对象的结构和内容,不被更改的时候,我们就要用到对象的保护
3.如何保护
保护对象的两个层面(保护属性,和保护结构)
保护属性分为两大类:数据属性和访问器属性
数据属性:
什么是数据属性?
实际存储在对象的属性值的属性
数据属性的四个特性:
1.value:就是属性值
2.writable:true/false 是否可修改该属性
3.enumerable:true/false:是否可遍历该属性
4.configureable:true/false 是否可删除该属性,是否可修改前两个属性
1.获取一个属性值的四个特性的函数
Object.getOwnPropertyDescriptor(对象)
let haiwang = {
name:'王杉',
age:18,
hobby:'撩妹'
}
console.log(Object.getOwnPropertyDescriptor(haiwang,'name'));
控制台的输出:
Object
- 1. configurable: true
- enumerable: true
- value: "王杉"
- writable: true
2.修改一个属性的特性
Object.defineProperty(对象,'属性值'{
‘开关’:true/false
})
Object.defineProperty(haiwang,'name',{
writable:false,//不能修改
})
haiwang.name = 'liquan';
console.log(haiwang);
3.修改多个属性特性
Object.defineProperties('对象',{
'属性值':{
‘开关’:true/false
}
})
访问器属性:
不实际存储值,只提供变量的保护
什么时候使用访问器的属性?
当用自定义的复杂规则保护属性,比如age必须介于18~60之间,
都要用到访问器的属性
定义访问器的属性的步骤:
1.首先给要保护对象的属性,设置一个假的对象,包括它,并且把它的数据属性设置为可写的
2.给对象的原有属性添加get和set这两个保镖,他们是成对出现的
Object.defineProperty(对象,‘原属性名’,{
get(){
}
set(value){
if(value<=age && age<=value){
this._age = value
}else{
throw errow('抛出错误')
}
注意:再访问器属性里面这两个属性是必须的
enumerable: true, // 保镖要代替原属性抛头露面
configurable: false, // 保镖不能轻易被删除 }
}
})
但是访问器的属性只是半隐藏,一旦外人知道受保护的半隐藏属性的时候,依然可用,直接访问,绕过保镖
内部属性:
什么是内部属性,就是不能通过.访问到的属性
防篡改:
1.什么是防扩展?
禁止添加新属性
设置防扩展
Object.preventExtensions(obj);
判断是否已经禁止扩展?
Object.isExtensible(obj); //true没有禁止扩展,false禁止扩展
2.对对象进行密封
在兼具防扩展的同时,也防止删处属性
设置密封
Object.Seal(obj)
判断是否密封
Object.isSealed(obj);
但是对对象密封,虽然不能删除属性和增加属性,但是可以修改属性
3.冻结:
Object.freeze(obj);
评论