本篇文章给大家带来的内容是关于es6中代理的详细介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
概述
代理嘛,就是请代理人代替自己做某件事,但是和自己不一样的是代理人可以有自己的行为,甚至可以做出和预期相违背的行为。
栗子
声明一个普通对象origin,他有一个属性name
let origin={ name: 'origin' }
声明一个代理对象
let proxy=new Proxy(origin, { get: (target, key)=>target[key]+" from proxy", set: (target, key, value)=>target[key]="set by proxy "+value })
此时输出origin
和proxy
,可以发现,proxy
拥有和origin
一样的name
属性
console.log(origin) // {name: 'origin'} console.log(proxy) // Proxy {name: 'origin'}
为origin
添加age
属性,再输出,可以发现,origin
和proxy
都拥有了age
属性
origin.age=1 console.log(origin) // {name: 'origin', age: '1'} console.log(proxy) // Proxy {name: 'origin', age '1'}
那就是代理吗,当然不是,我们尝试为proxy
添加属性
proxy.x=1 console.log(origin) // {name: 'origin', age: '1', x:'set by proxy 1'} console.log(proxy) // Proxy {name: 'origin', age '1'}
可以发现,虽然origin
和proxy
都拥有了x
属性,但是并不是我们赋值的1
,而是多了set by proxy
几个字符串,很明显,这里是执行了初始化proxy
时传入的第二个对象的set
方法
那如果我们get
呢
console.log(proxy.x) // set by proxy 1 console.log(proxy.x) // set by proxy 1 from proxy
现在很清楚了,proxy
就是origin
的代理,所有在proxy
上的操作都会同步到origin
上,而对origin
的操作却不会同步到proxy
上,而且proxy
还有自己的行为。
可以这么想,proxy
就是origin
的秘书,所有的事务处理都要提交给秘书,秘书有自己的办事准则,可以直接提交给老板,也可以拒绝提交,或者添加一些其他的行为再提交。那这个秘书到底能代理老板做哪些事呢?
陷阱
语法
let p = new Proxy(target, handler);
初始化一个代理需要有两个参数
target
:代理目标
handle
:陷阱,是一个对象,我们的操作就像一只逃跑的动物,如果猎人在所有可以逃跑的路上全部放满了陷阱,那我们总是会落入一起一个的。本质就是一个对象,键描述我们的操作,值是函数,描述我们的行为,一共有13
种陷阱。
0x003 set
:设置属性
语法:
set(target, key, value)
target
: 代理对象
key: 设置的属性
value
: 设置的属性值
栗子:
let origin={} let proxy=new Proxy(origin,{ set:(target, key, value)=>{ if(value>5)target[key]=value+10000 } }) proxy.x=1 proxy.y=10 console.log(proxy) // Proxy {y: 10010} console.log(origin) // {y: 10010}
说明:
上面我们放置了一个set
陷阱,当我们做set
操作的时候,就会被捕捉到,我们判断value
是否大于5
,如果不大于5
我们就不会做任何东西,但是如果大于5
,就会给做赋值操作,并且还将他加上了10000
。上面的栗子就相当于一个拦截器了。
get:访问属性
语法:
get(target, key)
target
: 代理对象
key: 访问的属性
栗子:
let origin={ x:1, y:2 } let proxy=new Proxy(origin,{ get:(target, key)=>{ if(key==='x')return 'no' return target[key] } }) console.log(proxy.x) // 'no' console.log(proxy.y) // 2
deleteProperty:删除属性
语法:
deleteProperty(target, key)
target
: 代理对象
key: 要删除的属性
栗子:
let origin={ x:1, y:2 } let proxy=new Proxy(origin,{ deleteProperty:(target, key)=>{ if(key==='x')return delete target[key] } }) delete proxy.x delete proxy.y console.log(proxy) // {x:1}
has:判断是否包含某属性
语法:
has(target, key)
target
: 代理对象
key: 要判断的属性
栗子:
let origin={ x:1, y:2 } let proxy=new Proxy(origin,{ has:(target, key)=>{ if(key==='x')return false return true } }) console.log('x' in proxy) // false console.log('y' in proxy) // true
ownKeys
:获取自身属性值
-
语法:
ownKeys(target)
target
: 代理对象-
栗子:
let origin={ x:1, y:2 } let proxy=new Proxy(origin,{ ownKeys:(target)=>{ return ['y'] } }) console.log(Object.getOwnPropertyNames(proxy)) // ['y']
getPrototypeOf
:获取prototype
-
语法:
getPrototypeOf(target)
target
: 代理对象-
栗子
let origin={ x:1, y:2 } let proxy=new Proxy(origin,{ getPrototypeOf:(target)=>{ return null } }) console.log(Object.getPrototypeOf(p)) // null
setPrototypeOf
:设置prototype
-
语法:
setPrototypeOf(target, prototype)
target
: 代理对象prototype
: 要设置的prototype
-
栗子
let origin={ x:1, y:2 } let proxy=new Proxy(origin,{ setPrototypeOf:(target, prototype)=>{ throw 'no' } }) Object.setPrototypeOf(proxy, {}) // Uncaught no
defineProperty
:设置属性描述
-
语法:
defineProperty(target, prop, descriptor)
target
: 代理对象prop
: 要设置描述的属性descriptor
: 描述-
栗子
let origin={} let proxy=new Proxy(origin,{ defineProperty:(target, prop, descriptor)=>{ throw 'no' } }) Object.defineProperty(proxy, 'x', {configurable: true}) // Uncaught no
getOwnPropertyDescriptor
:获取自身属性描述
-
语法:
getOwnPropertyDescriptor(target, prop)
target
: 代理对象prop
: 获取描述的属性-
栗子
let origin={} let proxy=new Proxy(origin,{ getOwnPropertyDescriptor:(target, prop)=>{ throw 'no' } }) Object.getOwnPropertyDescriptor(proxy, 'x') // Uncaught no
isExtensible
:判断是否可扩展
-
语法:
isExtensible(target)
target
: 代理对象-
栗子
let origin={} let proxy=new Proxy(origin,{ isExtensible:(target)=>{ return false } }) console.log(Object.isExtensible(proxy)); // false
preventExtensions
:阻止扩展
-
语法:
preventExtensions(target)
target
: 代理对象-
栗子:
let origin={} let proxy=new Proxy(origin,{ preventExtensions:(target)=>{ return false; } }) console.log(Object.preventExtensions(proxy)); // Uncaught TypeError: 'preventExtensions' on proxy: trap returned falsish
construct
:构造
-
语法:
construct(target, argumentsList, newTarget)
target
: 代理对象argumentsList
: 参数列表newTarget
: 新对象-
栗子:
let Origin=function(){} let OriginProxy=new Proxy(Origin,{ construct: function(target, argumentsList, newTarget) { throw 'error' } }) new OriginProxy() // Uncaught error
apply
:调用
-
语法:
apply(target, thisArg, argumentsList)
target: 代理对象
thisArg: 上下文
argumentsList: 参数列表
-
栗子:
let origin=function(){} let proxy=new Proxy(origin,{ apply: function(target, thisArg, argumentsList) { throw 'error' } }) origin() // Uncaught error
以上是es6中代理的详细介绍(代码示例)的详细内容。更多信息请关注PHP中文网其他相关文章!

在es6中,可以利用“Array.isArray()”方法判断对象是否为数组,若判断的对象是数组,返回的结果是true,若判断对象不是数组,返回的结果是false,语法为“Array.isArray(需要检测的js对象)”。

es6中遍历跟迭代的区别是:遍历强调的是要把整个数据依次全部取出来,是访问数据结构的所有元素;而迭代虽然也是依次取出数据,但是并不保证取多少,也不保证把所有的数据取完,是遍历的一种形式。

在es6中,可用Object对象的is()方法来判断两个对象是否相等,该方法检测两个变量的值是否为同一个值,判断两个对象的引用地址是否一致,语法“Object.is(对象1,对象2)”;该方法会返回布尔值,若返回true则表示两个对象相等。

转换方法:1、利用“+”给数字拼接一个空字符,语法“数字+""”;2、使用String(),可把对象的值转换为字符串,语法“String(数字对象)”;3、用toString(),可返回数字的字符串表示,语法“数字.toString()”。

sort排序是es6中的;sort排序是es6中用于对数组的元素进行排序的方法,该方法默认不传参,按照字符编码顺序进行排序,排序顺序可以是字母或数字,并按升序或降序,语法为“array.sort(callback(a,b))”。

在es6中,assign用于对象的合并,可以将源对象的所有可枚举属性复制到目标对象;若目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性,语法为“Object.assign(...)”

改变方法:1、利用splice()方法修改,该方法可以直接修改原数组的内容,语法为“数组.splice(开始位置,修改个数,修改后的值)”;2、利用下标访问数组元素,并重新赋值来修改数组数据,语法为“数组[下标值]=修改后的值;”。

在es6中,import as用于将若干export导出的内容组合成一个对象返回;ES6的模块化分为导出与导入两个模块,该方法能够将所有的导出内容包裹到指定对象中,语法为“import * as 对象 from ...”。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

记事本++7.3.1
好用且免费的代码编辑器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。