zoukankan      html  css  js  c++  java
  • tamper-proof 对象 nonextensible对象 sealed对象 frozen对象

    tamper-proof 对象
    JavaScript的缺点之一就是每个对象都可以被相同执行上下文的代码修改,很容易导致意外覆盖,或则一不小心把native 对象覆盖。
    Ecmascript  5提供了 tamper-proof 对象来解决这个问题。一旦一个对象被设为 tamper-proof 对象就无法撤销了。
    下面依次介绍:

     

    1、nonextensible对象
    默认所有对象都是可拓展的,可以添加属性和方法。通过object.preventExtensions()来禁止拓展
    var person = { name: “Nicholas” };
    Object.preventExtensions(person);
    person.age = 29;
    alert(person.age); //undefined

     

    对于原本就存在的属性是不受影响的,可以修改删除,可以通过object.isExtensible()来判断。
    var person = { name: “Nicholas” };
    alert(Object.isExtensible(person)); //true
    Object.preventExtensions(person);
    alert(Object.isExtensible(person)); //false
    N

     
     

    sealed对象  
    对象无法拓展的同时,原有的属性无法删除,可以修改。因为它们的[[configurable]]被设为false,无法把数据属性改为存取器属性,无法使用object.defineProperty()。
    var person = { name: “Nicholas” };
    Object.seal(person);
    person.age = 29;
    alert(person.age); //undefined
    delete person.name;
    alert(person.name); //”Nicholas”

     

    可以用object.isSeal()来检测是否密封了:
    var person = { name: “Nicholas” };
    alert(Object.isExtensible(person)); //true
    alert(Object.isSealed(person)); //false
    Object.seal(person);
    alert(Object.isExtensible(person)); //false
    alert(Object.isSealed(person)); //true
    S

     

    frozen对象
    这个比以上两种更加严格,原本存在的属性都不能修改了,[[writable]]被设为false。
    存取器属性只有set函数定义了的情况下才能改。
    var person = { name: “Nicholas” };
    Object.freeze(person);
    person.age = 29;
    alert(person.age); //undefined
    delete person.name;
    alert(person.name); //”Nicholas”
    person.name = ”Greg”;
    alert(person.name); //”Nicholas”

     

    可以使用object.isFrozen()来检测:
    var person = { name: “Nicholas” };
    alert(Object.isExtensible(person)); //true
    alert(Object.isSealed(person)); //false
    alert(Object.isFrozen(person)); //false
    Object.freeze(person);
    alert(Object.isExtensible(person)); //false
    alert(Object.isSealed(person)); //true
    alert(Object.isFrozen(person)); //true

  • 相关阅读:
    Elementui el-input 实现自定义 v-model
    巧用Ajax的beforeSend 提高用户体验
    医生不会告诉你,它是天然“安眠药”,一周吃2次,一觉自然醒!
    CentOS下搭建SVN服务器
    linux下 mysql数据库的备份和还原
    最新sublime text 3 注册码license分享(亲测有效)
    Centos 安装 Nginx 详细过程
    centos如何安装Python3
    python安装提示No module named setuptools,wget提示ERROR 403: SSL is required
    bash: pip: command not found... 解决方法
  • 原文地址:https://www.cnblogs.com/chuangweili/p/5166346.html
Copyright © 2011-2022 走看看