介绍
这篇文章主要为大家展示了“JS中ES6代理代理怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS中ES6代理代理怎么用”这篇文章吧。
代理的概念
<代码> 代码>代理英文原意是代理的意思,在<代码> ES6> 代码中,可以翻译为“代理器“。它主要用于改变某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(<代码>元编程> 代码),即对编程语言进行编程。
<代码>代理> 代码在目标对象的外层搭建了一层拦截,外界对目标对象的某些操作(后文会说明,有哪些操作可以拦截),必须通过这层拦截。<强>语法强>
var proxy =, new 代理(目标,,处理程序);
通过构造函数生成代理代码> <代码>,<代码> 代码>目标参数是要拦截的目标对象,<代码>处理程序> 代码参数也是一个对象,用来定制拦截行为。
<强>例子强>
var obj =, new 代理( {},才能 {才能 ,,,,得到:,function (关键目标,,,,接收器),{ ,,,,,console.log (“getting ${关键}!”); ,,,,,return Reflect.get(目标,,,,接收机); ,,,}, ,,,:,function (关键目标,,,,,,接收器),{ ,,,,,console.log (“setting ${关键}!”); ,,,,,return Reflect.set(目标,,,,,,接收机); ,,,}, ,,} );
一般将<代码>处理> 代码参数说成配置对象,在配置对象中,可以定义需要拦截的操作。如果配置对象为空,那么对<代码>代理> 代码的操作将直通目标对象。
对代理操作才有拦截效果,而不是目标对象。
引用><强>代理实例的方法强>
当读取不存在的属性时候,抛出错误而不是返回<代码>定义代码>
var person =, { ,,名字:“张三“, }; var proxy =, new 代理(人,,{ ,,得到:function (目标,财产),{ ,,,if (property 拷贝;目标),{ ,,,,,return 目标(财产); ,,,},{else ,,,,,throw new ReferenceError (& # 39; Property “& # 39;, +, Property +, & # 39;“, does not 存在# 39;公司); ,,,} ,,}, }); proxy.name;,//,“张三“; proxy.age;,//,抛出一个错误拦截读取继承属性
let proto =, new 代理( {},才能 {才能 ,,,get(目标,propertyKey,,接收器),{ ,,,,,console.log (“GET “, +, propertyKey); ,,,,,return 目标(propertyKey); ,,,}, ,,} ); let obj =, Object.create(原型); obj.xxx;,//,“GET xxx"数组读取负数索引(负数索引表示倒着取数)
function createArray(…元素),{ let 才能;handler =, { ,,,get(目标,propKey,,接收器),{ ,,,,,let index =,数量(propKey); ,,,,,if (index & lt;, 0), { ,,,,,,,propKey =,字符串(时间+ target.length 指数); ,,,,,} ,,,,,return Reflect.get(目标,propKey,,接收机); ,,,}, ,,}; let 才能;target =, []; target.push才能(…元素); return 才能;new 代理(目标,,处理程序); } let arr =, createArray (“a",,“b",,“c"); arr [1];,//, c实现数据的限制
let validator =, { ,,:function (obj,,,,值),{ ,,,if (prop ===,“age"), { ,,,,,if (! Number.isInteger(值)),{ ,,,,,,,throw new TypeError (“, age is not an integer"); ,,,,,} ,,,,,if (value 祝辞,200),{ ,,,,,,,throw new RangeError (“, age seems invalid"); ,,,,,} ,,,} ,,,//,对于年龄以外的属性,直接保存 ,,,obj[支持],=,价值; ,,}, }; let person =, new 代理({},,验证器); 时间=person.age 100; person.age;//, 100 时间=person.age “young",,//,报的错 person.age =, 300,,//,报错防止内部属性”<代码> \ _ 代码> "被外部读写(通常我们以下划线开的头,表示其实内部属性)
var handler =, { 有才能(目标,,键),{ null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null nullJS中ES6代理代理怎么用