es6中代理的详细介绍(代码示例)时间:2024/5/5作者:未知来源:争怎路由网人气: 网页的本质就是超级文本标记语言,通过结合使用其他的Web技术(如:脚本语言、公共网关接口、组件等),可以创造出功能强大的网页。因而,超级文本标记语言是万维网(Web)编程的基础,也就是说万维网是建立在超文本基础之上的。超级文本标记语言之所以称为超文本标记语言,是因为文本中包含了所谓“超级链接”点。 本篇文章给大家带来的内容是关于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 :获取自身属性值 getPrototypeOf :获取prototype
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 :判断是否可扩展
preventExtensions :阻止扩展
语法: preventExtensions(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中代理的详细介绍(代码示例) | |