注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易邮箱前端技术中心

汇聚最新最劲爆的前端技术

 
 
 

日志

 
 
 
 

[翻译]JS里的对象保护  

2013-09-24 17:46:10|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
原文:Protecting Objects in JavaScript http://www.2ality.com/2013/08/protecting-objects.html

这篇文章简单回顾在javascript中如何使objects 完全的保护起来。有三个层次:
     1,最弱的保护Prevent Extentisons;
     2,好一点的保护Sealing;
     3,最强保护 freezing 

1.Preventing Extensions: 不允许扩展属性
     上面代码后,obj就不可能再增加属性。 例子如下:
     var obj = { foo:'a' };
     Object.preventExtensions(obj);
    宽松模式(sloppy mode)下,不能成功增加属性值:
     >obj.bar='b';
     >obj.var
     undefined
    严格模式(strict mode)下,会抛出错误。(可以通过IIFE方法转换模式)

    > (function () { 'use strict'; obj.bar = 'b' }());
    TypeError: Can't add property bar, object is not extensible

   不过还是可以删掉属性的:
   > delete obj.foo
   true 
   > obj.foo 
   undefined

  1.1.  检测object是否可以扩展
   上面代码检测obj是否可以扩展
     > Object.isExtensible(obj)
    false

2.Sealing:完全的密封
    禁止扩展属性,并且使其他属性“unconfigurable”.后面这个词的意思是obj里面值的属性不可改变了。只读属性还是只能只读,枚举属性只能是只读等等.
     (顺便说一句,javascript 允许“unconfigurable”值从可写改为只读。有历史原因的)
    下面列子来说明属性 “unconfigurable”
     > var obj = { foo: 'a' };
    > Object.getOwnPropertyDescriptor(obj, 'foo')  // before sealing
    { value: 'a',
      writable: true,
      enumerable: true,
      configurable: true }

    > Object.seal(obj)

    > Object.getOwnPropertyDescriptor(obj, 'foo')  // after sealing
    { value: 'a',
      writable: true,
      enumerable: true,
      configurable: false }
    
   上面代码后,还是可以改变foo值:
    > obj.foo = 'b';
    'b'
    > obj.foo
    'b'

    可是不能改变其属性了。
     > Object.defineProperty(obj, 'foo', { enumerable: false });
    TypeError: Cannot redefine property: foo    
   补充一句,obj同样再也不能扩展值了。
    
   2.1. 检测obj是否密封sealed.
     Object.isSealed(obj)
    
3.Freezing
  使所有的属性值都不可写并且seal obj。也就是说,obj 不可扩展,所有的属性值都是只读的,并且没有方法改变属性值的属性。
    var point = { x: 17, y: -5 };
    Object.freeze(point);
   同样在宽松模式下不会抛出错误:   
    > point.x = 2;  // 代码无效, point.x 是只读的
    > point.x
    17     
     
   > point.z = 123;  //代码无效, point 是不可扩展的
    > point
    { x: 17, y: -5 }
 
    在严格模式下则会抛出错误:
     > (function () { 'use strict'; point.x = 2 }());
    TypeError: Cannot assign to read-only property 'x'

    > (function () { 'use strict'; point.z = 123 }());
    TypeError: Can't add property z, object is not extensible
 
   3.1 检测obj是否frozen

by yzzhan
  评论这张
 
阅读(729)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017