JavaScript之防篡改对象(高级技巧)
来源:互联网 发布:php curl获取不到数据 编辑:程序博客网 时间:2024/06/03 11:47
在实际开发中,有时会无意地修改了别人的代码,或者用不兼容的功能重写原生对象,这样会给整个开发带来困扰。使用防篡改方式可以防止别人篡改对象代码。
注:一旦对象定义为防篡改,就无法撤销了。也就是说无法改回来了。
不可扩展对象
在默认情况下,所有对象都是可以扩展的,也就是说,无论什么时候都可以向对象中添加属性和方法。
例如以下,先定义一个对象,再向其添加一个新属性:
var obj = { name: "Tom"}obj.age = 21;console.log(obj.age); //21
即使先定义好一个对象,后面也可以向其新添加属性和方法。
Object.preventExtensions()方法
现在使用Object.preventExtensions()方法可以改变这个行为,这样就不能向对象中新添加属性和方法了。不可扩展量一级保护措施。var obj = { name: "Tom"}Object.preventExtensions(obj); //阻止篡改对象obj.age = 21;console.log(obj.age); //undefined//修改原有的属性obj.name = "Bob";console.log(obj.name); //Bob
可以发现,使用了Object.preventExtensions()方法,就不能向对象中新添加属性和方法了,但是可以修改对象原有的属性和方法。
Object.isExtensible()方法
使用这个方法可以确定对象是否为可篡改,如果可篡改,则返回true,相反返回false。
var obj = { name: "Tom"}console.log(Object.isExtensible(obj)); //trueObject.preventExtensions(obj); //阻止篡改对象console.log(Object.isExtensible(obj)); //false
密封的对象
对象的第二个保护级别就是密封对象,密封对象不可扩展,且其对象的属性特性[[Configurable]]被设置为false,意味着对象的属性和方法不能通过delete操作符删除。
Object.seal()方法
该方法用于密封对象。
var obj = { name: "Tom"}//密封对象Object.seal(obj);obj.age = 21;console.log(obj.age); //undefined 不能新添加属性delete obj.name;console.log(obj.name); //Tom 不能删除对象的属性
密封的对象不能新添加属性、不能删除属性。拥有了不可扩展对象的特性。
Object.isSealed()方法
该方法用于确定对象是否是密封对象,如果是密封对象返回true,相反返回false。
var obj = { name: "Tom"}console.log(Object.isExtensible(obj)); //trueconsole.log(Ojbect.isSealed(obj)); //falseObject.seal(obj);console.log(Object.isExtensible(obj)); //falseconsole.log(Ojbect.isSealed(obj)); //true
冻结对象
保护对象的最高级防篡改就是冻结对象。冻结的对象,即是不可扩展的,也是密封的,而且其属性的特性[[Writable]]被设置为false,也就是说属性值也不能修改。
Object.freeze()方法
该方法用于设置对象为冻结对象。
var obj = { name: "Tom"}Object.freeze(obj); //冻结对象obj.age = 21;console.log(obj.age); //undefined 不可扩展delete obj.name;console.log(obj.name); //Tom 不可删除obj.name = "Bob";console.log(obj.name); //Tom 不可修改
冻结对象同时拥有了不可扩展对象、密封对象的特性。
Object.isFrozen()方法
该方法用于确定对象是否是冻结对象。如果是返回true,相反返回false。
var obj = { name: "Tom"}//未冻结之前console.log(Oject.isExtensible(obj)); //trueconsole.log(Oject.isSealed(obj)); //falseconsole.log(Oject.isFrozen(obj)); //false//冻结对象之后Object.freeze(obj); //冻结对象console.log(Oject.isExtensible(obj)); //falseconsole.log(Oject.isSealed(obj)); //trueconsole.log(Oject.isFrozen(obj)); //true
总结:
不可扩展对象、密封对象均可修改属性。
不可扩展对象、密封对象、冻结对象均不可扩展。
密封对象、冻结对象均不可删除属性。
阅读全文
1 0
- JavaScript之防篡改对象(高级技巧)
- js高级技巧之防篡改对象
- 【JavaScript 高级技巧】防篡改对象+高级定时器
- JavaScript 高级技巧——“防篡改对象”的注意要点
- JavaScript 防篡改对象
- javascript防篡改对象
- 深入理解javascript之防篡改对象
- JavaScript中防篡改对象
- ECMAScript5防篡改对象
- js防篡改对象
- 说说如何使用 JavaScript 创建防篡改对象
- 防篡改
- 防篡改
- javascript高级系列之节流[throttle]与防抖[debounce ]
- 【javascript】javascript之面向对象高级特性
- 极客学院之javascript高级技巧
- 梆梆企业版加固技术之防篡改剖析
- 网站防篡改解决方案
- Kinect1.0如何安装与运行
- Linux命令学习总结: file命令[转载]
- 建立一个Map实例,k值为String类型,v值为Integer类型。依次用put方法输入如下: map.put("Kobe", 24); map.put("James", 6); map.put("
- Linux之awk命令
- 『安全工具』Nmap 强悍的端口扫描工具
- JavaScript之防篡改对象(高级技巧)
- C语言strcmp()函数:比较字符串(区分大小写)
- 术语单词
- windows git 服务器配置
- hihocoder 1290 Demo Day 二维图的dp
- 最短路径简单题 (主要是bellman+dijkstra)
- android开发流程说明
- linux whereis
- scrapy当当当当 连衣裙分类