es6 新增构造函数 Proxy

  Proxy 构造函数,可以使用new 去创建,可以往里面插入两个参数,都是对象

let target = {}
let handler = {}
let proxy = new Proxy(target,handler);
proxy.a = 'b'
console.log(proxy.a) //b

  上面代理拦截的操作handler 是个空对象所有不产生任何影响,target 代表时需要代理的哪个对象

  Proxy 一共可以代理拦截对象的13种操作

  1. get  当读取对象属性时触发 get 拦截一共可以传入三个参数 get(target,key,receiver) target 代表当前对象,key 当前属性名

  receiver 一般用不上,代表的是Proxy 对象

//常见的对象 get操作 代理
var handler = {
get (target,key,receiver) {
console.log(key);
return `您想要的值是${target[key]}`
}
}
var proxyy=new Proxy({},handler);
proxyy.xx=;
console.log(proxyy.xx); //xx 您想要的值是90 //如果一个对象属性不可配置 且不可写,则不能使用proxy 访问此属性
var definedObject = Object.defineProperty({},'name',{
writable:false,// 属性是否科协
configurable:false,// 是否可重新配置
value:'czcz' // 默认值
})
var prox = new Proxy(definedObject,handler);
prox.name;
//proxy.js:23 Uncaught TypeError: 'get' on proxy:
//property 'name' is a read-only and non-configurable data property
//on the proxy target but the proxy did not return its actual
//value (expected 'czcz' but got '您想要的值是czcz')

  2.set set拦截一共可以传入四个参数 (target,key,value,receiver) 前三个参数必传,最后一个参数可选,以此代表,对象

  属性名,设置的属性值,Proxy 对象

// proxy 的set 方法,使用了set 一定要对target[key] 赋值要不会返回undefined
// 如下要是if条件过后 没有 target[key] = value 则 proz.age 最终会是undefined
var sethandler = {
set (target,key,value,receiver) {
if(key == 'name') {
target[key] = `魔人的小妖精${value}`
return
}
target[key] = value
}
}
var proz = new Proxy({},sethandler);
proz.name = 'ljkkk';
proz.age = '';
console.log(proz.name,proz.age) //魔人的小妖精ljkkk 18 //如果对象的属性描述是不可写,则不能使用proxy set 方法
var objsetfalse = Object.defineProperty({},'name',{
value:'czcz',
writable:false
}) var proc = new Proxy(objsetfalse,sethandler);
proc.name = 'lklk';
console.log(proc.name) //输出'czcz' 说明sethandler 里面的set操作无用

  3.apply   拦截对象的apply和call,和函数的调用 ,  apply一共可以传入三个参数 ,apply(target,ctx,args) ,目标对象,目标对象的上下文对象,参数数组

//apply 拦截函数的调用
var applyhandler = {
apply (target,ctx,args) {
console.log('apply',ctx,args)
}
}
var fn = function () {
console.log('xxccc');
}
var prolk = new Proxy(fn,applyhandler);
prolk(); // apply undefined []
//拦截 apply or call 操作
prolk.apply({},[,,]); //apply {} (3) [1, 3, 4]
prolk.call(null,,,); //apply null (3) [1, 3, 5]

  4.has 拦截hasProperty 操作判断对象是否具有某个属性是生效,has(target,key) 方法值传入连个参数, has 只有执行in 操 

  作时生效,但执行 for in 不生效(注如果某个属性不可配置或者该对象不可扩展则不能使用has拦截)

//has 属性的拦截
var hashandler = {
has (target,key) {
if(key === 'name') {
return false
}
return true
}
}
var prohas = new Proxy({},hashandler);
prohas.age = ''
prohas.name = 'zc'
console.log('name' in prohas) //false
console.log('age' in prohas) // true

  5.construct 当使用new 去创建一个对象时进行拦截 construct(target,args,newtarget) 当前对象,参数,实例对象

var conhandler = {
construct (target,args,newtarget) {
console.log(target.args,newtarget)
return new target(...args)
}
}
var pp = new Proxy(function () {},conhandler)
new pp('',''); //undefined ƒ () { [native code] }
//传入的一定要是个构造函数
 

es6 proxy代理的更多相关文章

  1. 新的知识点来了-ES6 Proxy代理 和 去银行存款有什么关系?

    ES给开发者提供了一个新特性:Proxy,就是代理的意思.也就是我们这一节要介绍的知识点. 以前,ATM还没有那么流行的时候(暴露年纪),我们去银行存款或者取款的时候,需要在柜台前排队,等柜台工作人员 ...

  2. ES6 proxy代理详解及用法

    proxy官方的详细解释为代理器,个人理解为相当于一个拦截器,外部的所有访问必须先通过这层拦截,监视到对象的读写过程,因此提供了这 种机制对外部的访问进行过滤和修改. 上述例子为proxy new一个 ...

  3. ES6 proxy(代理拦截) &&Reflect

  4. ES6新特性:Proxy代理器

    ES6新特性:Proxy: 要使用的话, 直接在浏览器中执行即可, node和babel目前还没有Proxy的polyfill;,要使用的话,直接在浏览器中运行就好了, 浏览器的兼容性为:chrome ...

  5. 详解es6中Proxy代理对象的作用

    在es6中新添加了Proxy,那么它有什么作用啊?Proxy本意为代理,而es6中的Proxy也就是代理对象,那么代理对象感觉听起来很模糊,在这里就解释一下Proxy代理对象的作用. Proxy的主要 ...

  6. es6 Proxy对象详解

    Proxy用于修改某些操作的默认行为,也可以理解为在目标对象之前架设一层拦截,外部所有的访问都必须先通过这层拦截,因此提供了一种机制,可以对外部的访问进行过滤和修改.这个词的原理为代理,在这里可以表示 ...

  7. ES6 Proxy 性能之我见

    ES6 Proxy 性能之我见 本文翻译自https://thecodebarbarian.com/thoughts-on-es6-proxies-performance Proxy是ES6的一个强力 ...

  8. Vue3.0 响应式数据原理:ES6 Proxy

    Vue3.0 开始用 Proxy 代替 Object.defineProperty了,这篇文章结合实例教你如何使用Proxy 本篇文章同时收录[前端知识点]中,链接直达 阅读本文您将收获 JavaSc ...

  9. C++设计模式-Proxy代理模式

    Proxy代理模式 作用:为其他对象提供一种代理以控制对这个对象的访问. 代理的种类: 如果按照使用目的来划分,代理有以下几种: 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代 ...

随机推荐

  1. SSL,TLS

    今天突然收到邮件说SSL不能用了,基于SSL的HTTPS协议不通了,怎么办? java/android 的网络编程简直一窍不通,平时都是用到了问百度.只能恶补有关网络的知识了. 传输协议: 传输协议中 ...

  2. Eclipse连接Hadoop集群及WordCount实践

    声明:作者原创,转载注明出处. 作者:帅气陈吃苹果 一.环境准备 1.JDK安装与配置 2.Eclipse下载 下载解压即可,下载地址:https://pan.baidu.com/s/1i51UsVN ...

  3. rocketMQ安装中遇到的坑

    安装步骤是这些: Prerequisite The following softwares are assumed installed: 64bit OS, Linux/Unix/Mac is rec ...

  4. jQuery拼图小游戏

    jQuery拼图小游戏 最后样式 核心代码部分 <script type="text/javascript" > $(function () { $("td& ...

  5. rsync命令详解、rsync用ssh隧道方式同步

    ● rsync格式安装命令 yum install -y rsync与scp的区别:scp复制为完全覆盖,rsync为增量同步,只同步修改过的数据.rsync命令格式如下: rsync 选项 源文件 ...

  6. 【Matlab&Mathematica】对三维空间上的点进行椭圆拟合

    问题是这样:比如有一个地心惯性系的轨道,然后从轨道上取了几个点,问能不能根据这几个点把轨道还原了? 当然,如果知道轨道这几个点的速度的情况下,根据轨道六根数也是能计算轨道的,不过真近点角是随时间变动的 ...

  7. 同事搭一个测试RAC说节点2发现idle了,报ORA-00304

    [oracle@testrac2 11204]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Wed Jan 16 1 ...

  8. 【IIS】解决IIS无响应假死状态,asp突然无法访问重启后可以使用是什么原因

    在IIS6下,经常出现w3wp的内存占用不能及时释放,从而导致服务器响应速度很慢. 可以做以下配置:1.在IIS中对每个网站进行单独的应用程序池配置.即互相之间不影响.2.设置应用程序池的回收时间,默 ...

  9. FFmpeg开发实战(六):使用 FFmpeg 将YUV数据编码为视频文件

    本文中实现的一个小功能是把一个YUV原始视频数据(时间序列图像)经过h264编码为视频码流,然后在使用mp4封装格式封装. 编码&封装的流程图如下: 使用ffmpeg编码流程: 1.首先使用a ...

  10. 2. CMake 系列 - 编译多文件项目

    目录 1. 编译不使用第三方库的项目 1.1 项目目录结构 1.2 相关代码 1.3 编译 2. 编译使用第三方库的项目 2.1 项目目录结构 2.2 相关代码 2.3 编译 1. 编译不使用第三方库 ...