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. final、static、代码块、静态代码块、内部类、代码执行顺序

    final final域使得确保初始化安全性(initialization safety)成为可能,初始化安全性让不可变形对象不需要同步就能自由地被访问和共享 作用在类上               ...

  2. TensorFlow[1]:概念和简例

    简介 TensorFlow是一个实现机器学习算法的接口,也是执行机器学习算法的框架.使用数据流式图规划计算流程,可以将计算映射到不同的硬件和操作系统平台. 主要概念 TensorFlow的计算可以表示 ...

  3. JQuery使用笔记

    1.选择器 id选择器: $('#btnShow') class选择器: $('.banner') tag选择器: $('input') 2.常用方法 取 / 设value: $('#btnShow' ...

  4. Python 爬虫练习(一) 爬取国内代理ip

    简单的正则表达式练习,爬取代理 ip. 仅爬取前三页,用正则匹配过滤出 ip 地址和 端口,分别作为key.value 存入 validip 字典. 如果要确定代理 ip 是否真的可用,还需要再对代理 ...

  5. Fedora 23建立wifi热点(Android手机可用)

    在ubuntu14.04下使用ap-hotspot,速度还不错.但是在15.04下就用不了了,不知为啥.现在使用fedora23,在学校还是挺需要给手机连wifi的,于是google看看ap-hots ...

  6. JavaEE中的MVC(一)Dao层彻底封装

    最近Android工作实在难找,考虑是不是该转行做Java了,今天开始,花几天的事件,研究一下JavaEE各层优化. 首先是Dao层 增删改方法封装 使用PreparedStatement执行一条Sq ...

  7. CS窗体程序数据列表分页

    以前,觉得winform程序分页很无趣,也没实际意义,直到近期的项目实践中让我认识到原来winform数据列表分页也是非常有必要的,因为由于数据量过大的情况,当窗体在初始加载数据的时候如果不做条件的限 ...

  8. Service使用详解

    Service是Android系统中的四大组件之一,主要有两个应用场景:后台运行和跨进程访问.Service可以在后台执行长时间运行操作而不提供用户界面,除非系统必须回收内存资源,否则系统不会停止或销 ...

  9. PHP招聘那些事,公司真的不需要培训班出来的人么?

    就业形势严峻的情况下,每个企业对于人才的需求都不一样,并不是说公司不愿意招聘培训班出来的人,而是看你的能力是不是能胜任企业招聘人才的需求,是不是能给企业带来价值的人. 现在市面上的培训机构多如牛毛,然 ...

  10. PHP7源码安装MongoDB和MongoDB拓展

    一.安装MongoDB 1.创建mongodb用户组和用户 groupadd mongodb useradd -r -g mongodb -s /sbin/nologin -M mongodb 2.下 ...