由于JavaScript共享的特性,任何对象都可以被放在同一环境下运行的代码修改。

例如:
var person = {name:"caibin'}
person.age = 21;
即使第一行定义了完整的person对象,那么第二行代码仍然可以对其添加属性,删除属性等。
我们有三个方法可以防止你做出这些行为。

一、不可扩展对象:
先来看person本身的扩展性:
Object.isExtensible(person); // true

接下来执行:
Object.preventExtensions(person);
Object.isExtensible(person) ;// false
person.age = 29;
console.log(person.age) ;//undefined

默认情况下,person.age = 29会静默失败,严格模式下,会报错。
然后,我们可以修改之前已经存在的person的属性。
例如:
person.name = "cb"; 
console.log(person.name); // cb

甚至可以删除:
delete person.name; // true;
console.log(person) ; // {}

小结:当对象被设置为不可扩展之后,不可以增加属性,但是可以修改,删除原来存在的属性。

二、密封的对象:
密封对象意味着:不可扩展,不能删除属性和方法,但是属性值是可以修改的。
先来看默认的对象的密封性和扩展性:
var caibin = {name:"caibin"};
console.log(Object.isSealed(caibin)); // false;
console.log(Object.isExtensible(caibin)); // true

接下来,执行密封操作:
Object.seal(caibin);

然后,检查扩展性:
console.log(Object.isExtensible(caibin)); // false 不可扩展
caibin.age = 21;
console.log(caibin.age) ;// undefined

删除属性:
delete caibin.name; // false; 删除失败
console.log(caibin.name) ;// caibin

修改属性:
caibin.name = "cb";
console.log(caibin.name);//cb 修改成功

三、冻结的对象:
这是最严格的防篡改级别,冻结的对象即不可扩展,又是密封的,对象的数据属性Writable被设置成false,这意味着不能修改属性的值。
先看对象默认的密封性,扩展性,冻结性:
var cb = {name:"caibin"}
console.log(Object.isExtensible(cb)) ;// true;
console.log(Object.isSealed(cb)) ;// false
console.log(Object.isFrozen(cb)); // false

然后,执行冻结操作:
Object.freeze(cb);

查看扩展性:
console.log(Object.isExtensible(cb)); // false
cb.age = 21;
console.log(cb.age); // undefined

查看密封性:
console.log(Object.isSealed(cb)); // true;
delete cb.name ;// false
console.log(cb.name) ;// caibin

查看Writable属性:
cb.name = "cb";
console.log(cb.name);//caibin 说明Writable属性被设置成false.

JavaScript中的防篡改对象的更多相关文章

  1. javascript中遇到的字符串对象处理

    在javascript中对参数处理: 1 <script> 2 function getParam() 3 { 4 urlInfo=window.location.href; //获取当前 ...

  2. javascript中的内置对象

    2015.12.1 javascript中的内置对象 复习: 1.js中的内置函数 alert prompt write parseInt parseFloat eval isNaN document ...

  3. (转载)JavaScript中的Window窗口对象

    (转载)http://www.ijavascript.cn/jiaocheng/javascript-window-65.html 例子: <html> <head> < ...

  4. javaScript中Math内置对象基本方法入门

    概念 Math 是javaScript的内置对象,包含了部分数学常数属性和数学函数方法. Math 不是一个函数对象,用户Number类型进行使用,不支持BigInt. Math 的所有属性与方法都是 ...

  5. JavaScript防篡改对象

    不可扩展对象 默认情况下,所有对象都是可扩展的,使用Object.preventExtensions()方法可以改变这一行为. var person = { name: "Hiram&quo ...

  6. WebApi系列~安全校验中的防篡改和防复用

    回到目录 web api越来越火,因为它的跨平台,因为它的简单,因为它支持xml,json等流行的数据协议,我们在开发基于面向服务的API时,有个问题一直在困扰着我们,那就是数据的安全,请求的安全,一 ...

  7. 深入理解Javascript中构造函数和原型对象的区别

    在 Javascript中prototype属性的详解 这篇文章中,详细介绍了构造函数的缺点以及原型(prototype),原型链(prototype chain),构造函数(constructor) ...

  8. JavaScript中的原型和对象机制

    1.对象相关的一些语言特性 JavaScript里所有的东西都是对象, 对象是属性的集合.要知道,函数也是对象, 能够作为变量的值. 返回值. 参数或者属性的值. 函数对象特殊的地方是能通过" ...

  9. 谈谈javascript中的日期Date对象

    一.日期对象  在javascript中并没有日期型的数据类型,但是提供了一个日期对象可以操作日期和时间.  日期对象的创建:  new Date();二.将日期对象转换为字符串  将日期对象转换为字 ...

随机推荐

  1. php7.0.12 laravel 链接sqlserver数据库

    https://www.microsoft.com/en-us/download/details.aspx?id=20098 下载最后一个,然后这个工具可以将dll扩展下载下来,选择一个空白的文件夹就 ...

  2. android nfc中MifareClassic格式的读写

    Android支持的数据格式 数据格式的Intent filter AndroidManifest.xml文件中,要像向下列示例那样,在<activity>元素内的<meta-dat ...

  3. vue-cli安装失败问题

    1.尝试 管理员权限 安装,看是否能解决问题 2.仍未解决问题, 系统变量增加:  C:\Program Files\nodejs\node cache\node_modules\vue-cli\bi ...

  4. 全国城市三级联动 html+js

    全国城市三级联动,没有css,所以屏幕的自适应必须自己想办法,手机端慎用(最好不要用,因为有些我也说不出的展示问题). html页面 <!DOCTYPE html> <html> ...

  5. 分享一个动态生成RDLC报表的类

    在实际工作中,当需要进行大批量查询和生成报表的时候,可以使用我写的类. 特点: 无需报表设计器.无需为报表设置数据集 只需要传入查询结果就可以全自动生成报表,传入的对象为Dynamic(目前支持Dat ...

  6. C#中使用正则表达式验证电话号码、手机号、身份证号、数字和邮编

      验证电话号码的主要代码如下: public bool IsTelephone(string str_telephone) { return System.Text.RegularExpressio ...

  7. mvc 中的 [ChildActionOnly] 和 [NonAction]

    首先,NonAction表示它不是一个真正的Action,而是一个普通方法, 就像我们定义一个普通的方法那样,返回值可以任意定义; 而  ChildActionOnly表示它只能在View中通过Htm ...

  8. timus 1175. Strange Sequence 解题报告

    1.题目描述: 1175. Strange Sequence Time limit: 1.0 secondMemory limit: 2 MB You have been asked to disco ...

  9. Vim命令合集大全

    命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim ...

  10. python 学习(二)--关于类

    1.没有权限控制,在类方法或变量前加 "__" 两下划线,则变为"私有"变量(实际通过_<类名>__<变量或方法名> 可以访问) 2.类 ...