由于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. composer--------------通过composer.json下载laravel包----barryvdh/laravel-debugbar

    1.去Packagist网站https://packagist.org/packages/barryvdh/laravel-debugbar#dev-master找到

  2. 本机ip+端口不能访问web server,外部却可以访问

    本机ip+端口不能访问web server,外部却可以访问! 这个奇葩的问题困扰了我好久,别人通过ip访问我的server一切正常,自己却访问不了,一度怀疑win10的问题,久寻无果! 最后关闭ads ...

  3. WCF学习目的

    WCF,window communication Foundation,是微软推出的面向服务应用的一款产品. 近来为一个WEB app前端项目写后台接口.涉及到跨域访问,服务代理等方面的内容.项目的需 ...

  4. 基于ThinkPHP开发的PHPExcel导出

    首先我们需要去PHPExcel官网下载开源包 下载好了以后只需要把里面的classes文件夹解压出来就可以用了! 在ThinkPHP中,文件的命名空间还是很重要的,我试着按照其他的第三方命名写name ...

  5. LINUX的磁盘管理du命令详解

    LINUX的磁盘管理du命令详解 du(disk usage)命令可以计算文件或目录所占的磁盘空间.没有指定任何选项时, 它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作 ...

  6. php 两段文本对比,不同的文字显示高亮

    php 两段文本对比,不同的文字显示高亮[下面这个只能区分错误后面的..]   <?php $str1 ="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwgg ...

  7. win7下matlab2016a配置vlfeat

    1.下载vlfeat http://www.vlfeat.org/ 2.解压到了matlab安装目录的toolbox下 3.打开vs2013的这个 4.输入nmake version  查看我的版本是 ...

  8. 微信支付JsAPI

    https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip 下载获取微信支付demo压缩包 打开压缩包,并将其中 Wxpay ...

  9. JSON对象转换问题

    今天调用别人接口遇到一个问题,原本约定的data格式为:JSON字符串,但本次返回了一个空字符串"", 大概是这样的 字符串类型的httpResult.data值为字result: ...

  10. sqlite嵌入式数据库C语言基本操作(2)

    :first-child{margin-top:0!important}img.plugin{box-shadow:0 1px 3px rgba(0,0,0,.1);border-radius:3px ...