防篡改: 对对象整体的保护
三个级别: 不可逆
1. 防扩展: 禁止扩展新属性
其实就是设置对象的Extensible属性为false
Object.preventExtensions(obj);
尝试扩展新属性: 禁用
2. 密封对象: 防扩展的基础上,禁止配置或删除每个属性
其实就是将每个属性的configurable设置为false
仅能读写属性值
Object.seal(obj);
尝试扩展新属性: 禁用
尝试修改属性的特性: **允许**
尝试删除: 禁止
尝试修改属性值: 允许
问题: chrome中,密封后依然可修改属性的特性
3. 冻结对象: 禁止对对象做任何修改,包括属性值
Object.freeze(obj)
尝试扩展新属性: 禁用
尝试修改属性的特性: 禁止
尝试删除: 禁止
三个级别: 不可逆
1. 防扩展: 禁止扩展新属性
其实就是设置对象的Extensible属性为false
Object.preventExtensions(obj);
尝试扩展新属性: 禁用
2. 密封对象: 防扩展的基础上,禁止配置或删除每个属性
其实就是将每个属性的configurable设置为false
仅能读写属性值
Object.seal(obj);
尝试扩展新属性: 禁用
尝试修改属性的特性: **允许**
尝试删除: 禁止
尝试修改属性值: 允许
问题: chrome中,密封后依然可修改属性的特性
3. 冻结对象: 禁止对对象做任何修改,包括属性值
Object.freeze(obj)
尝试扩展新属性: 禁用
尝试修改属性的特性: 禁止
尝试删除: 禁止
尝试修改属性值: 禁止
eg:
<script>
"use strict";
var smith={id:1234,ename:"smith",age:19};
<span style="background-color: rgb(255, 0, 0);">//1:禁止扩展</span>
/*Object.preventExtensions(smith);
smith.salary=10000;
console.log(smith.salary);//undefined//每个属性的configurable=false
*/
<span style="background-color: rgb(255, 0, 0);">//2:seal密封,打包</span>
/*Object.seal(smith);
//尝试扩展新属性:已禁用
smith.salary=10000;
console.log(smith.salary);
//尝试修改属性的新特性,仍然可用
Object.defineProperty(smith,"id",{
writable:false//将id设置为只读,说明现在的浏览器对ES5的防篡改有漏洞
})
//尝试删除属性
smith.id=1001;
console.log(smith.id);
*/
<span style="background-color: rgb(255, 0, 0);">//3:冻结对象</span>
Object.freeze(smith);
//尝试修改属性值:已禁用
console.log(
Object.getOwnPropertyDescriptor(smith,"age");
);
//尝试扩展新属性
smith.salary=1000;
console.log(smith.);
</script>