es6中代理的详细介绍(代码示例)

本篇文章给大家带来的内容是关于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=1console.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 1console.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=1proxy.y=10console.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.xdelete proxy.yconsole.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) // falseconsole.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中代理的详细介绍(代码示例)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2736708.html

(0)
上一篇 2025年3月8日 01:27:35
下一篇 2025年3月8日 01:27:44

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • ES6和ES7异步处理的详解(代码示例)

    本篇文章给大家带来的内容是关于es6和es7异步处理的详解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 一次性掌握ES6/ES7异步处理 假定一个场景,等女朋友睡起来出去逛街,超过5s就不等了,自己打游戏了 …

    编程技术 2025年3月8日
    000
  • javascript如何实现值的类型转换

    本篇文章给大家介绍使用javascript进行值的类型转换的方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 JavaScript是松散类型的语言,大多数情况下,运算符和函数会自动将值转换为正确的类型(隐式转换);但也…

    2025年3月8日 编程技术
    200
  • es6中模块化的内容介绍(代码示例)

    本篇文章给大家带来的内容是关于es6中模块化的内容介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 概述 模块化是一个大型项目的必然趋势。 命名导出 可以使用export关键字,导出你要导出的东西,可以导出常…

    编程技术 2025年3月8日
    200
  • 浏览器的进程与线程的介绍

    本篇文章给大家带来的内容是关于浏览器的进程与线程的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 进程 进程是cpu的资源分配的最小单位。 多进程:多进程指的是在同一个时间里,同一个计算机系统中如果允许两个或两个以上的…

    编程技术 2025年3月8日
    200
  • javascript如何将字符串反转输出

    javascript如何实现字符串的反转?本篇文章就给大家介绍javascript怎么将字符串反向输出,让大家了解javascript反转字符串的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。【相关视频教程推荐:ja…

    2025年3月8日 编程技术
    200
  • 在javascript中如何使用严格模式?使用示例

    javascript中如何使用严格模式?本篇文章就给大家简单介绍javascript中的严格模式是什么意思?如何使用?有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 严格模式是什么意思?有什么用? 严格模式是ECMAScr…

    编程技术 2025年3月8日
    200
  • JavaScript中==和===的区别是什么

    本篇文章我们给大家带来的内容是介绍JavaScript中==和===运算符之间的区别是什么?有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 首先我们要知道:JavaScript中’==’运算符表示抽…

    2025年3月8日
    200
  • puppeteer爬虫是什么?爬虫的工作原理

    本篇文章给大家带来的内容是介绍puppeteer爬虫是什么?爬虫的工作原理。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 爬虫(puppeteer)是什么? 爬虫又称网络机器人。每天或许你都会使用搜索引擎,爬虫便是搜索引…

    2025年3月8日
    200
  • JavaScript如何创建对象?实例化对象的方法

    本篇文章给大家带来的内容是介绍JavaScript如何创建对象,让大家了解用js创建并实例化对象的三种方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 在语法方面上,JavaScript是一种灵活的面向对象语言。在我们…

    2025年3月8日
    200
  • Vue数据通信的详细介绍(附实例)

    本篇文章给大家带来的内容是关于vue数据通信的详细介绍(附实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 一、前言 组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无…

    2025年3月8日 编程技术
    200

发表回复

登录后才能评论