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. android studio 的自动更新问题

    地址背墙了 没办法... 只有另寻他法了: 在Android Studio安装目录/bin/studio(对应版本, x86, x64).vmoptions文件中追加以下几行 -Djava.net.p ...

  2. Windows系统重装

    http://www.ishuo.cn/show/76437.htmlhttp://jingyan.baidu.com/article/d8072ac45d4f60ec95cefdaa.html

  3. 深入理解ES6之——JS类的相关知识

    基本的类声明 类声明以class关键字开始,其后是类的名称:剩余部分的语法看起来像对象字面量中的方法简写,并且在方法之间不需要使用逗号. class Person { //等价于prototype的构 ...

  4. 【html】01_html的介绍

    [HTML专修介绍] 定义: HTML(HypertextMarkup Language),超文本标记语言 如何理解: (意思就是超越了文本,还能兼容图片,视频,声音字节) 它的主要用处是什么? 就是 ...

  5. codeforces 883M. Quadcopter Competition 思路

    M. Quadcopter Competition time limit per test 3 seconds memory limit per test 256 megabytes input st ...

  6. liunx分布式监控工具

    监控你的WEB服务器或者WEB主机运行是否正常与健康是非常重要的.你要确保用户始终可以打开你的网站并且网速不慢.服务器监控工具允许你收集和分析有关你的Web服务器的数据. 有许多非常好的服务器监控解决 ...

  7. 生成pdf

    /** * 生成pdf * @param string $html 需要生成的内容 */ function pdf($html='<h1 style="color:red"& ...

  8. jQuery的$.ajax方法响应数据类型有哪几种?本质上原生ajax响应数据格式有哪几种,分别对应哪个属性?

    jQuery的$.ajax方法响应数据类型有:xml.html.script.json.jsonp.text 本质上原生ajax响应数据格式只有2种:xml和text,分别对应xhr.response ...

  9. L贪心基础

    <span style="color:#330099;">/* L - 贪心 基础 Time Limit:1000MS Memory Limit:65536KB 64b ...

  10. 页面的新开页,window.open的hacker

    一.window.open如何进行hack 网上看的办法很多,归根接地还是不能解决掉,只有通过a标签的target属性 $obj.click(function(){  var newTab=windo ...