You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functioncreateArray(...elements){lethandler={get(target,propKey,receiver){letindex=Number(propKey);if(index<0){propKey=String(target.length+index);}returnReflect.get(target,propKey,receiver);}};lettarget=[];target.push(...elements);returnnewProxy(target,handler);}letarr=createArray('a','b','c');arr[-1]// c
letvalidator={set: function(obj,prop,value){if(prop==='age'){if(!Number.isInteger(value)){thrownewTypeError('The age is not an integer');}if(value>200){thrownewRangeError('The age seems invalid');}}// 对于满足条件的 age 属性以及其他属性,直接保存obj[prop]=value;}};letperson=newProxy({},validator);person.age=100;person.age// 100person.age='young'// 报错person.age=300// 报错
'use strict';consthandler={set: function(obj,prop,value,receiver){obj[prop]=receiver;// 无论有没有下面这一行,都会报错returnfalse;}};constproxy=newProxy({},handler);proxy.foo='bar';// TypeError: 'set' on proxy: trap returned falsish for property 'foo'
你是怎么理解ES6中Proxy的?使用场景?
一、介绍
定义: 用于定义基本操作的自定义行为
本质: 修改的是程序默认形为,就形同于在编程语言层面上做修改,属于元编程
(meta programming)
元编程(Metaprogramming,又译超编程,是指某类计算机程序的编写,这类计算机程序编写或者操纵其它程序(或者自身)作为它们的数据,或者在运行时完成部分本应在编译时完成的工作
一段代码来理解
这段程序每执行一次能帮我们生成一个名为
program
的文件,文件内容为1024行echo
,如果我们手动来写1024行代码,效率显然低效Proxy
亦是如此,用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)二、用法
Proxy
为 构造函数,用来生成Proxy
实例参数
target
表示所要拦截的目标对象(任何类型的对象,包括原生数组,函数,甚至另一个代理))handler
通常以函数作为属性的对象,各属性中的函数分别定义了在执行各种操作时代理p
的行为handler解析
关于
handler
拦截属性,有如下:propKey in proxy
的操作,返回一个布尔值delete proxy[propKey]
的操作,返回一个布尔值Object.keys(proxy)
、for...in
等循环,返回一个数组Object.getOwnPropertyDescriptor(proxy, propKey)
,返回属性的描述对象Object.defineProperty(proxy, propKey, propDesc)
,返回一个布尔值Object.preventExtensions(proxy)
,返回一个布尔值Object.getPrototypeOf(proxy)
,返回一个对象Object.isExtensible(proxy)
,返回一个布尔值Object.setPrototypeOf(proxy, proto)
,返回一个布尔值Reflect
若需要在
Proxy
内部调用对象的默认行为,建议使用Reflect
,其是ES6
中操作对象而提供的新API
基本特点:
Proxy
对象具有的代理方法,Reflect
对象全部具有,以静态方法的形式存在Object
方法的返回结果,让其变得更合理(定义不存在属性行为的时候不报错而是返回false
)Object
操作都变成函数行为下面我们介绍
proxy
几种用法:get()
get
接受三个参数,依次为目标对象、属性名和proxy
实例本身,最后一个参数可选get
能够对数组增删改查进行拦截,下面是试下你数组读取负数的索引注意:如果一个属性不可配置(configurable)且不可写(writable),则 Proxy 不能修改该属性,否则会报错
set()
set
方法用来拦截某个属性的赋值操作,可以接受四个参数,依次为目标对象、属性名、属性值和Proxy
实例本身假定
Person
对象有一个age
属性,该属性应该是一个不大于 200 的整数,那么可以使用Proxy
保证age
的属性值符合要求如果目标对象自身的某个属性,不可写且不可配置,那么
set
方法将不起作用注意,严格模式下,
set
代理如果没有返回true
,就会报错deleteProperty()
deleteProperty
方法用于拦截delete
操作,如果这个方法抛出错误或者返回false
,当前属性就无法被delete
命令删除注意,目标对象自身的不可配置(configurable)的属性,不能被
deleteProperty
方法删除,否则报错取消代理
三、使用场景
Proxy
其功能非常类似于设计模式中的代理模式,常用功能如下:使用
Proxy
保障数据类型的准确性声明了一个私有的
apiKey
,便于api
这个对象内部的方法调用,但不希望从外部也能够访问api._apiKey
还能通过使用
Proxy
实现观察者模式观察者模式(Observer mode)指的是函数自动观察数据对象,一旦对象有变化,函数就会自动执行
observable
函数返回一个原始对象的Proxy
代理,拦截赋值操作,触发充当观察者的各个函数观察者函数都放进
Set
集合,当修改obj
的值,在会set
函数中拦截,自动执行Set
所有的观察者参考文献
The text was updated successfully, but these errors were encountered: