20200918岳浩天
知识总结
防扩展
什么是防扩展?
禁止添加新属性,相当于将对象的extensible:false
设置防扩展
Object.preventExtensions(obj)
让一个对象变的不可扩展,也就是永远不能再添加新的属性,禁止强行给当前对象添加新属性
判断是否已禁止扩展
Object.isExtensible(obj)
问题:只能防扩展,不防删除
密封
什么是密封?
在兼具防扩展同时,又进一步禁止删除属性。但是,属性值还是可以修改的。在防扩展同时,禁止删除现有属性,相当于将每个属性的configurable:false,其他属性在修改特性时,不必反复修改configurable:false
密封对象
Object.seal(obj)
1. 如果使用了seal,就不用使用preventExtensions()了。因为seal中涵盖了防扩展的特点
2. 其实,seal就是自动将所有属性的configurable都自动改为了false。从此,只用seal,所有属性上的configurable:false,都可省略。默认都是关着的,false。一般的对象保护到密封级别就够了
判断是否密封
Object.isSealed(obj)
删除对象
delete obj.属性名
问题:实现一个JS类型,包含public属性和private属性
function Emp(eid,ename,salary,age){
this.eid=eid;
this.ename=ename;
this.salary=salary;
Object.defineProperties(this,{
id:{writable:false},
salary:{enumerable:false},
_age:{
writable:true,
enumerable:false
},
age:{
get:function(){return this._age;},
set:function(val){
if(val<18||val>65)
throw new Error('超出范围')
this._age=val;
},
enumerable:true
}
});
this.age=age;
// 防篡改:密封
Object.seal(this);
}
var emp=new Emp()
emp.age=20
emp.eid=101
emp.salary=30000
emp.ename="dingding"
冻结
什么是冻结?
即不能添加新属性,又不能删除现有属性。甚至连属性值都不能修改。在密封同时,禁止修改所有属性的值,相当于将每个属性的writable:false
什么时候使用?
如果一个对象中所有属性值都不允许擅自修改。很多模块共同使用的对象,不能随意被一方篡改
冻结对象
Object.freeze(obj)
判断是否冻结
Object.isFrozen(obj);
冻结原理
不但禁止添加新属性,且自动修改所有configurable:false,且自动修改所有writable:false
心得
今天进行了周考,得出 以前学习的知识不经常复习 忘得很快,很多原来掌握的 看着很熟悉,就是想不起来
还有思维逻辑能力欠缺
近期评论