李权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. 1. configurable: true
    1. enumerable: true
    2. value: "王杉"
    3. 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);

评论