Proxy是ES6提供的代理器可以起到拦截作用,写法形式如 var proxy = new Proxy(target,handler);参数target表示要拦截的目标对象,handler是用来定制拦截行为。

var proxy = new Proxy({},{
get : function (target,property) {
return 'This is Proxy!';
}
});
console.log(proxy.a); //This is Proxy!
  Proxy支持拦截操作一览:拦截对象的读(get)或写(set)、拦截propKey in proxy的操作(has返回布尔值)、拦截删除(deleteProperty返回一个布尔值)、拦截for(var x in proxy)(enumerate返回一个遍历器)等等。
  set示例代码

let validator = {
set : function (obj,prop,value) {
if(prop === 'age'){
if(!Number.isInteger(value)){
throw new TypeError('年龄必须是数字!');
}
if( value > 100){
throw new TypeError('请输入有效年龄');
}
}else{
console.log("输入错误!!请检查"); //输入错误!!请检查
}
obj[prop] = value ; },
};
let person = new Proxy({},validator);
console.log(person.sss=100); //
console.log(person.age=100); //100

  下面写一个在对象内部设置内部属性防止内部属性被外部属性读或写。

var ceshi = {
get : function (target,key) {
test(key,'get');
return target[key];
},
set : function (target,key,value) {
test(key,'set');
if(key === 'age'){
if(0<value<100){
console.log(`年龄是${value}`);
}
if(value>100){
console.log("输入的年龄无效!!!");
}
if(value<0){
console.log("年龄不能为负数");
}
}else{
console.log("你传入的参数不对");
}
return true;
},
}
function test(key,action) {
if(key[0] === '_'){
return console.log("你传入的参数不对,请重新传入参数");
}
}
var target = {} ;
var proxy = new Proxy(target,ceshi); console.log(proxy.age); //undefined
console.log(proxy.age = 20); //年龄是20 20
console.log(proxy.age = 120); //年龄是120 输入的年龄无效!!! 120
console.log(proxy._age); //undefined

  如果想拦截函数的调用那么使用apply()方法,该方法接受三个参数目标对象

var twice = {
apply(target,ctx,args){
console.log(args); //[ 1, 2, 3 ]
return Reflect.apply(...arguments) * 2;
}
};
function sum(...arguments) {
let add = 0;
for (let i = 0; i < arguments.length; i++){
add += parseInt(arguments[i]);
}
return add;
console.log(add);
}
var proxy = new Proxy(sum,twice);
console.log(proxy(1,2,3)+"这个proxy"); //12这个proxy console.log(sum(1,2,3)+'这是sum'); //6这是sum

  如果你想取消一个Proxy的示例那么使用revoke()方法,形式是ProxyName.revoke()。  

  还有其他几种方法,我这里面就简单的说下吧,
    1.deleteProperty()该方法用于拦截delete操作,如果这个方法返回false或者是抛出错误当前属性就被delete命令删除
    2.defineProperty()该方法拦截了Object.defineProperty操作
    3.enumerate()该方法用于拦截for...in循环,注意不可与has()方法弄混(has方法用于拦截in操作符)。
    4.has()该方法用于拦截in操作符
    5.construct()方法用于拦截new命令
    6.getOwnPropertyDescriptor()该方法用于拦截Object.getOwnPropertyDescriptor返回一个属性描述对象或者是undefined。
    7.getPrototypeOf()该方法用于拦截Object.getPrototypeOf()运算符以及一些其他操作。
    8.isExtensible()该方法用于拦截Object.isExtensible操作。
9.ownKeys()该方法用于拦截Object.keys()操作。
10.preventExtensions()方法该方法用于拦截Object.preventExtensions()操作。
11.setPrototypeOf()方法该方法用于拦截Object.setPrototypeOf()操作。

ES6之Proxy及Proxy内置方法的更多相关文章

  1. python黑魔法 -- 内置方法使用

    很多pythonic的代码都会用到内置方法,根据自己的经验,罗列一下自己知道的内置方法. __getitem__ __setitem__ __delitem__ 这三个方法是字典类的内置方法,分别对应 ...

  2. python常用数据类型内置方法介绍

    熟练掌握python常用数据类型内置方法是每个初学者必须具备的内功. 下面介绍了python常用的集中数据类型及其方法,点开源代码,其中对主要方法都进行了中文注释. 一.整型 a = 100 a.xx ...

  3. 7.python字符串-内置方法分析

    上篇对python中的字符串内置方法进行了列举和简单说明,但这些方法太多,逐一背下效率实在太低,下面我来对这些方法按照其功能进行总结: 1.字母大小写相关(中文无效) 1.1 S.upper() -& ...

  4. 6.python字符串-内置方法列举

    所谓内置方法,就是凡是字符串都能用的方法,这个方法在创建字符串的类中,下面是总结: 首先,我们要学习一个获取帮助的内置函数 help(对象) ,对象可以是一个我们创建出来的,也可以是创建对象的那个类, ...

  5. python 字典内置方法get应用

    python字典内置方法get应用,如果我们需要获取字典值的话,我们有两种方法,一个是通过dict['key'],另外一个就是dict.get()方法. 今天给大家分享的就是字典的get()方法. 这 ...

  6. 内置方法+lambda是pythonic的利器

    python可以写的非常简洁,通过使用内置的map,reduce,filter,lambda方法,非常具有文艺范. 举个例子,例如 def fromIpToNum(ipAddr):    return ...

  7. 字符串:各种奇葩的内置方法 - 零基础入门学习Python014

    字符串:各种奇葩的内置方法 让编程改变世界 Change the world by program 字符串:各种奇葩的内置方法 或许现在又回过头来谈字符串,有些朋友可能会觉得没必要,也有些朋友会觉得不 ...

  8. s14 第4天 关于python3.0编码 函数式编程 装饰器 列表生成式 生成器 内置方法

    python3 编码默认为unicode,unicode和utf-8都是默认支持中文的. 如果要python3的编码改为utf-8,则或者在一开始就声明全局使用utf-8 #_*_coding:utf ...

  9. while补充,字符串和数字的内置方法

    一.while循环的补充 while True: name=input('please input your name: ') password=input('please input your pa ...

  10. JavaScript基础:BOM的常见内置方法和内置对象

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. BOM的介绍 JavaScript的组成 JavaScript基础分为三 ...

随机推荐

  1. 【玩转树莓派】使用 sinopia 搭建私有 npm 服务器

    简介 使用 sinopia 的好处是,node系的工程师,内部协作时,使用自有 npm 包,会非常方便:另外,sinopia,会缓存已经下载过的包,可以在相当程度上,加速 npm install 相关 ...

  2. Celery 源码解析七:Worker 之间的交互

    前面对于 Celery 的分布式处理已经做了一些介绍,例如第五章的 远程控制 和第六章的 Event机制,但是,我认为这些分布式都比较简单,并没有体现出多实例之间的协同作用,所以,今天就来点更加复杂的 ...

  3. AES加密实现

    起因 这段时间因为要对接一个外部接口,其参数的加密方式为AES,就需要学下AES的加密写法,但网上的资料不是很全,自己记录下遇到的坑: 基本写法 String str = "hello&qu ...

  4. DNS:域名系统

    概述: DNS的作用在于将域名转换为对应的IP地址. DNS名字空间和UNIX文件系统相似,也是树形结构.以"."结尾的域名称为FQDN(Full Qualified Domain ...

  5. 【SpringMVC】使用Myeclipse创建SpringMVC项目【超详细教程】

    之前一直是使用Eclipse创建Web项目,用IDEA和MyEclipse的创建SpringMVC项目的时候时不时会遇到一些问题,这里把这个过程记录一下,希望能帮助到那些有需要的朋友.我是用的是MyE ...

  6. Mysql update in报错 [Err] 1093 - You can't specify target table 'company_info' for update in FROM clause

    Mysql update in报错 解决方案: [Err] 1093 - You can't specify target table 'company_info' for update in FRO ...

  7. UEditor1.4.3.3实现图片上传、删除功能

    1.下载ueditor1.4.3.3 UTF-8的版本 2.新建一个项目,在项目中添加UEditor,把下载好的插件都放在ueditor这个文件夹中,在进行一些基本的配置 3.在根目录下新建一个为in ...

  8. apache mysql无法启动解决办法

    最近在调试几个代码,需要不停的启动关闭服务器和mysql.在连续的几次开关后,无法启动了,每次启动后就直接关闭. 刚开始是怀疑是不是端口被占用了,查看端口后,并没有端口被占用的情况.查看mysql错误 ...

  9. win下搭建python3+PyQt5+eric6环境

    一.安装python3 1.下载python3的安装包,默认安装即可,注意勾选 Add Python 3.6 to Path .但是这样默认安装的路径太长,不太方便找到,可选择定制安装,自己定义安装路 ...

  10. Sonar常见问题分析

    1.Equality tests should not be made with floating point value 代码举例: if (result == num) //result和num均 ...