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

  • 相关阅读:
    Certificate、Provisioning Profile、App ID
    boundingRectWithSize
    IOS照片框架
    UIlabel 属性text
    UIMenuController的使用,对UILabel拷贝以及定制菜单
    iOS 自定义emoji表情键盘
    IOS第三方字体
    IOS 验证码
    网上收集的以及自己总结的iOS开发技巧
    给自己一个坚持下去的理由
  • 原文地址:https://www.cnblogs.com/chuangweili/p/5166346.html
Copyright © 2011-2022 走看看