资讯专栏INFORMATION COLUMN

JavaScript 高级技巧——“防篡改对象”的注意要点

atinosun / 261人阅读

摘要:防篡改对象不可扩展对象默认情况下,所有对象都是可扩展的不可扩展可以使用这个方法严格模式下会抛出错误一旦设置防扩展,对象就无法添加新的属性和方法。已有的属性方法不受影响,这些属性方法仍然可以修改和删除。检测是否被冻结,用方法

防篡改对象 不可扩展对象

默认情况下,所有对象都是可扩展的:

var person = {
    name: "Oliver"
};
person.age = 18;
console.log(person.age); //18

不可扩展可以使用这个方法: Object.preventExtensions(obj);

var person = {
    name: "Oliver"
};
person.age = 18;
console.log(person.age); //18
Object.preventExtensions(person);
person.gender = "male";
console.log(person.gender); //undefined

严格模式下会抛出错误;

一旦设置防扩展, 对象就无法添加新的属性和方法。 已有的属性方法不受影响, 这些属性方法仍然可以修改和删除。

var person = {
    name: "Oliver"
};
person.age = 18;
console.log(person.age); //18
Object.preventExtensions(person);
person.gender = "male";
console.log(person.gender); //undefined
person.name = "Oli";
console.log(person.name); //Oli

另外还可以通过使用Object.isExtensible()方法来确定对象是否可扩展

var person = {
    name: "Oliver"
};
person.age = 18;
console.log(person.age); //18
Object.preventExtensions(person);
person.gender = "male";
console.log(person.gender); //undefined
person.name = "Oli";
console.log(person.name); //Oli
console.log(Object.isExtensible(person)); //False
密封对象

密封对象可以使用方法: Object.seal(obj);

var person = {
    name: "Oliver"
};
Object.seal(person);
person.age = 18;
console.log(person.age); //undefined
person.name = "Oli";
console.log(person.name); //"Oli"
delete person.name;
console.log(person.name); //"Oli"

一旦设置密封对象, 不可以进行扩展, 已有属性和方法不可以删除, 但是属性值是可以修改的。

严格模式尝试添加或删除对象成员会抛出错误;

var person = {
    name: "Oliver"
};
Object.seal(person);
console.log(Object.isSealed(person)); //True
console.log(Object.isExtensible(person)); //False
冻结的对象

冻结对象可以使用方法: Object.freeze(obj);

一旦设置冻结对象, 既不可以扩展, 又是密封的, 只有通过访问器的set函数才可以修改属性值, 其他情况下不允许修改。

var person = {
    name: "Oliver"
};
Object.freeze(person);
person.name = "Oli";
console.log(person.name); //"Oliver"
person.age = 18;
console.log(person.age); //undefined
console.log(Object.isFrozen(person)); //True

检测是否被冻结,用Object.isFrozen()方法

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78789.html

相关文章

  • JS程序设计高级技巧

    摘要:关于定时器要记住的最重要的事情是指定的时间间隔表示何时将定时器的代码添加到队列,而不是何时实际执行代码。多个定时器之间的执行间隔会比预期的小解决办法处理中数组分块,,函数节流,实际进行处理的方法实际执行的代码初始处理调用的方法 一、高级函数 安全类型检测 Object.protitype.toString.call(value) 作用域安全的构造函数 function Pers...

    Codeing_ls 评论0 收藏0
  • JavaScript 高级技巧——“高级定时器”注意要点

    摘要:为了规避这个问题,可以使用定时器对事件处理程序进行节流。当第二次调用该函数时,它会清除前一次的定时器,并设置另一个。如果前一个定时器已经执行过了,这个操作就没有任何意义。然而如果前一个定时器尚未执行,其实就是将其替换为一个新的定时器。 高级定时器 为了解决setInterval的一些执行问题, 下面是采用链式setTimeout的方式来规避: setTimeout(function()...

    rubyshen 评论0 收藏0
  • JavaScript 高级技巧——“高级函数”注意要点

    摘要:语法如下注意这里使用的并不是的,是内部函数的。函数柯里化的基本方法是使用一个闭包返回一个函数。当函数被调用时,返回的函数还需要设置一些传入的参数。 安全的类型检测 typeof操作符 检测数据类型的结果可能会不正确; instanceof操作符 操作符在多个全局作用域下存在问题: var value = []; var isArray = value instanceof Array;...

    solocoder 评论0 收藏0
  • JavaScript高级程序设计》22章 JavaScript高级用法

    摘要:和的定义是指多少时间之后将回调函数加入到的执行队列之中回调函数是否立即执行取决于当前的执行队列是否空闲。比较好的例子如下回调函数执行其他操作假如内部的执行时间为那么的回调函数至少要等待才执行。 1、惰性加载函数 (判断各个浏览器中是否支持某个属性) function addEvent(elem, type, handler){ if(elem.addEventListener...

    wanglu1209 评论0 收藏0
  • JS红皮书解读之篡改对象

    摘要:注意一旦把对象定义为防篡改,就无法撤销了。使用阻止对象扩展注意严格模式下,不是而是报错。使用冻结对象对于库作者而言,冻结对象可防止有人修改库的核心对象。 showImg(https://segmentfault.com/img/remote/1460000019753620); 前言:去年7月份在简书写的,发现后端、React中也有体现,觉得有必要在微信上分享下。 注意:一旦把对象定义...

    张迁 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<