在ECMAScript 5里面,可以通过(writable 和 configurable)内部属性把属性设置为不可修改和不可删除的,可以通过(Object.preventExtensions() )让对象不允许被拓展新的属性,可以通过(Object.freeze())让对象的所有属性变为只读和不可删除的,同时也不能添加新属性,或者(Object.seal() )等。

 
"use strict";
var person = {
    name: "Nicholas"
};
Object.seal(person);
person.age = 20;    // Error!
 
上面的代码会触发错误,因为对象被密封了,不允许添加新属性
但是在非strict模式下,不会出现错误提示,即使属性无法添加,也不会有任何提示(通常访问不存在的对象属性只会返回undefined),这就会在调试上带来麻烦
 
当读从对象读取一个属性值的时候,会触发一个内部的[[Get]]操作来获取属性值,这是一个内部的不可改变的行为,但是通过 proxies 可以拦截javascript engine对[[Get]]的调用,转而调用自定义的函数
var proxy = new Proxy({ name: "Nicholas" }, {
    get: function(target, property) {
        if (property in target) {
            return target[property];
        } else {
            return 35;
        }
    }
});
 
console.log(proxy.time);        // 35
console.log(proxy.name);        // "Nicholas"
console.log(proxy.title);       // 35
 
改造一下便可以成为一个让对象不存在属性被访问时触发错误的函数
function createDefensiveObject(target) {
    return new Proxy(target, {
        get: function(target, property) {
            if (property in target) {
                return target[property];
            } else {
                throw new ReferenceError("Property \"" + property + "\" does not exist.");
            }
        }
    });
}
 
使用方式: 
var person = {
    name: "Nicholas"
};
 
var defensivePerson = createDefensiveObject(person);
 
console.log(defensivePerson.name);        // "Nicholas"
console.log(defensivePerson.age);         // Error!
 
其他常规操作不受影响
defensivePerson.age = 13;
console.log(defensivePerson.age);         // 13
console.log("name" in defensivePerson);               // true
console.log(defensivePerson.hasOwnProperty("name"));  // true
 
 
通过对设置内部[[Set]],可以让属性添加的时候判断类型
function createTypeSafeObject(object) {
 
    return new Proxy(object, {
          set: function(target, property, value) {
              var currentType = typeof target[property],
                   newType = typeof value;
 
              if (property in target && currentType !== newType) {
                  throw new Error("Property " + property + " must be a " + currentType + ".");
              } else {
                  target[property] = value;
              }
          }
    });
}
 
上面两个方法都可以安全用到构造函数里面,因为proxies是透明的,不影响其他代码
function Person(name) {
    this.name = name;
    return createTypeSafeObject(this);
}
 
var person = new Person("Nicholas");
 
console.log(person instanceof Person);    // true
console.log(person.name);                 // "Nicholas"

ECMAScript 6 proxies的更多相关文章

  1. My ECMAScript 7 wishlist

    With ECMAScript 6 now feature complete, any further changes to the core of JavaScript will happen in ...

  2. ECMAScript 6 Features 中文版

    ECMAScript 6 Features 中文版 如词不达意,欢迎提 PR & issue 采用中英混排的方式进行译制,如不解请查看对应原文 本文档将与原作者的 文档 保持同步更新,欢迎关注 ...

  3. ECMAScript 6 简介

    ECMAScript 6 是JavaScript的下一个标准,正处在快速开发之中,大部分已经完成了,预计将在2014年正式发布.Mozilla将在这个标准的基础上,推出JavaScript 2.0. ...

  4. ECMAScript 6新特性介绍

    箭头函数 箭头函数使用=>语法来简化函数.在语句结构上和C#.Java 8 和 CoffeeScript相似,支持表达式和函数体. . =>`操作符左边为输入的參数.而右边则是进行的操作以 ...

  5. ECMAScript 5和ECMAScript6的新特性以及浏览器支持情况

    ECMAScript简介: 它是一种由Ecma国际(前身为欧洲计算机制造商协会)制定和发布的脚本语言规范,javascript在它基础上经行了自己的封装.但通常来说,术语ECMAScript和java ...

  6. ECMAScript进化史(1):​话说Web脚本语言王者JavaScript的加冕历史

    互联网起火-Web时代的来临 在行文之前,反手就安利一下<浏览器史话中chrome霸主地位的奠定与国产浏览器的割据混战>. 浏览器始祖NCSA Mosaic在1993年1月发布(于1992 ...

  7. ECMAScript 6 扫盲

    ECMAScript 6 目前基本成为业界标准,它的普及速度比 ES5 要快很多,主要原因是现代浏览器对 ES6 的支持相当迅速,尤其是 Chrome 和 Firefox 浏览器,已经支持 ES6 中 ...

  8. ECMAScript 5

    2009年12月,ECMAScript 5.02011年6月,ECMAscript 5.1版发布2015年6月,ECMAScript 6正式通过,成为国际标准ES6第一个版本 ES2015,发布于20 ...

  9. ECMAScript 6入门

    预计在2014年底,ECMAScript 6将会正式发布,他的草案在13年3月份被冻结,后续提出新特性将会移至ECMASript 7中.目前还没有哪款浏览器实现了ES6的全部内容,兼容性最强的一款要数 ...

随机推荐

  1. 【重点突破】——Canvas技术绘制随机改变的验证码

    一.引言 本文主要是我在学习Canvas技术绘图时的一个小练习,绘制随机改变的验证码图片,虽然真正的项目里不这么做,但这个练习是一个掌握Canvas技术很好的综合练习.(真正的项目中验证码图片使用服务 ...

  2. ClassLoader类加载机制&&JVM内存管理

    一.ClassLoader类加载机制 在java中类加载是遵循委派双亲加载的:通过调用loadClass方法逐级往上传递委派加载请求,当找不到父ClassLoader时调用其findClass方法尝试 ...

  3. # C语言程序设计预备作业

    一.针对老师和学生是怎样的关系的看法 ==首先我认同邹欣老师的看法,下面也是我自己的一点见解.== #### (1)师生在教育内容的教学上结成授受关系 .从教师与学生的社会角色规定意义上看,在知识上, ...

  4. ZOJ2402 Lenny's Lucky Lotto List 简单DP

    Lenny's Lucky Lotto Lists Time Limit: 2 Seconds      Memory Limit:65536 KB Lenny likes to play the g ...

  5. WPF中的imagesource 和内存图片的处理

    [转载]ImageSource的使用心得 很多时候,我们会使用图片来装饰UI,比如作为控件背景等. 而这些图片可以分为两种形式,即存在于本地文件系统中的图片和存在于内存中的图片 对于这两种形式的图片, ...

  6. Spring ——简介及环境搭建跑通Hello

    Spring Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.是为了解决企业应用程序开发复杂性而创建的.框架的主要优 ...

  7. 强大的grep,sed和awk--用案例来讲解

    准备工作: 先简单了解grep,sed和awk功能 1) grep 显示匹配特定模式的内容 grep -v 'boy' test.txt 过滤掉test.txt文件的boy,显示其余内容 grep ' ...

  8. JavaScript中的this基本问题

    在函数中 this 到底取何值,是在函数真正被调用执行的时候确定下来的,函数定义的时候确定不了. 执行上下文环境 : **定义**:执行函数的时候,会产生一个上下文的对象,里面保存变量,函数声明和th ...

  9. Zookeeper 笔记-角色

    leader:提供读写服务,负责投票的发起和决议,更新系统状态 follower:为客户提供读服务,如果写服务则转发给leader,选举过程参与投票 observer:为客户端提供读服务,如果是写服务 ...

  10. 217. Contains Duplicate (leetcode)

    Given an array of integers, find if the array contains any duplicates. Your function should return t ...