什么是保护对象结构?
禁止对对象添加新属性和删除现有属性;
-
防止扩展
禁止给对象添加新属性
Object.preventExtensions(对象)
原理:其实在每个对象内部都有一个内部属性 extentsible = true; 也就是说所有对象默认都可以随意添加新属性,Object.preventExtensions(对象)会自动将对象内部属性的 extentsible = true改为extentsible = false ;从此该对象禁止添加新属性
//防扩展 禁止为对象添加新属性
var LiLei ={
sanme: "Li Lei",
sage:19,
className:"高三二班"
}
// 禁止为对象添加新属性
Object.preventExtensions(LiLei)
LiLei.Sname="李雷"
console.log(LiLei)
-
密封
既禁止添加新属性,又禁止删除现有属性 ,但是属性的值是可以随意修改的
Object.seal(对象)
原理:Object.seal(对象)自动做了两件事情,
自动将对象的内部属性extensible=false,从此该对象禁止添加新属性;
自动将对象中的每个属性的configurable=false,从此该对象禁止删除现有属性,并且自己不用反复写configurable=false了;
//密封 禁止为对象添加新属性 禁止删除现有属性
var LiLei ={
sanme: "Li Lei",
sage:19,
className:"高三二班"
}
Object.seal(LiLei)
LiLei.Sname="李雷" //尝试给对象添加新属性
delete LiLei.className //尝试给对象删除现有属性
console.log(LiLei)
-
冻结
既不能添加属性,又不能删除属性,还不能修改任何属性值!
Object.freeze(对象)
原理:Object.freeze(对象)自动做了三件事情,
自动将对象的内部属性extensible=false;从此该对象禁止添加新属性;
自动将对象内部属性的configurable=false,从此该对象禁止删除任何现有属性;
自动将对象中每个属性的write=false;从此该对象中的任何属性值都为只读禁止修改
冻结使用情景:
如果多个模块共用的对象,应该禁止任何其中一个模块 擅自修改该对象中的属性值。
// 冻结 既不能添加新属性 又不能删除现有属性 还不能修改任何属性值
var LiLei ={
sanme: "Li Lei",
sage:19,
className:"高三二班"
}
Object.freeze(LiLei)
LiLei.Sname="李雷" //尝试给对象添加新属性
delete LiLei.className //尝试给对象删除现有属性
LiLei.sage=20 //尝试给对象修改属性值
console.log(LiLei)