JavaScript中Proxy的详细介绍(代码示例)

本篇文章给大家带来的内容是关于javascript中proxy的详细介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

Proxy 让我们可以对任何对象的绝大部分行为进行监听和干涉,实现更多的自定义程序行为。

用法:new Proxy(target, handler)。

Proxy 通过设置行为监听方法来捕获程序对对应对象的行为。

    const obj = {};    const proxy = new Proxy(obj, {        // ...    })

登录后复制

Proxy 的构造器接受两个参数,第一个参数为需要进行包装的目标对象,第二个参数则为用于监听目标对象行为的监听器,其中监听器可以接受一些参数以监听相对应的程序行为。
监听属性、参数及监听内容

立即学习“Java免费学习笔记(深入)”;

属性值 监听器参数 监听内容

has(target, prop)监听 in 语句的使用get(target, prop, reciver)监听目标对象的属性读取set(target, prop, value, reciver)监听目标对象的属性赋值deleteProperty(target, prop)监听 delete 语句对目标对象的删除属性行为ownKeys(target)监听 Object.getOwnPropertyName() 的读取apply(target, thisArg, arguments)监听目标函数(作为目标对象)的调用行为construct(target, arguments, newTarget)监听目标构造函数(作为目标对象)利用 new 而生成实例的行为getPrototypeOf(target)监听 Objext.getPrototypeOf() 的读取setPrototypeOf(target, prototype)监听 Objext.setPrototypeOf() 的调用isExtensible(target)监听 Objext.isExtensible() 的读取preventExtensions(target)监听 Objext.preventExtensions() 的读取getOwnPropertyDescriptor(target, prop)监听 Objext.getOwnPropertyDescriptor() 的调用defineProperty(target, property, descriptor)监听 Object.defineProperty() 的调用

has

可以通过为 Proxy 的 handler 定义 has 监听方法,来监听程序通过 in 语句来检查一个字符串或数字是否为该 Proxy 的目标对象中某个属性的属性键的过程。

const p = new Proxy({}, {    has(target, prop){        console.log(`Checking "${prop}" is in the target or not`);        return true;    }})console.log('foo' in p);// Checking "foo" is in the target or not// true

登录后复制

该监听方法有两个需要注意的地方,如果遇到这两种情况,便会抛出 TypeError 错误。

1、当目标对象被其他程序通过 Object.preventExtensions() 禁用了属性拓展 (该对象无法再增加新的属性,只能对当前已有的属性进行操作,包括读取、操作和删除,但是一旦删除就无法再定义) 功能,且被检查的属性键确实存在与目标对象中,该监听方法便不能返回 false。

const obj = {foo: 1};Object.preventExtensions(obj);const p = new Proxy(obj, {    has(target, prop){        console.log(`Checking "${prop}" is in the target or not`);        return false;     }})console.log('foo' in p);   //抛出Uncaught TypeError:

登录后复制

2.当被检查的属性键存在与目标对象中,且该属性的 configurable 配置是 false 时,该监听方法不能返回 false。

const obj = {};Object.defineProperty(obj, 'foo', {    configurable: false,    value: 10})const p = new Proxy(obj, {    has(target, prop){        console.log(`Checking "${prop}" is in the target or not`);        return false;    }})console.log('foo' in p);//抛出Uncaught TypeError:

登录后复制

get

Getter只能对已知的属性键进行监听,而无法对所有属性读取行为进行拦截,而 Proxy 可以通过设定 get 监听方法,拦截和干涉目标对象的所有属性读取行为。

const obj = {foo: 1};const p = new Proxy(obj, {    get(target, prop){        console.log(`Program is trying to fetch the property "${prop}".`);        return target[prop];    }})alert(p.foo);  // Program is trying to fetch the property "foo".alert(p.something);    // Program is trying to fetch the property "something".

登录后复制

  这个监听方法也存在需要注意的地方——当目标对象被读取属性的 configurable 和 writable 属性都为 false 时,监听方法最后返回的值必须与目标对象的原属性值一致。

const obj = {};Object.defineProperty(obj, 'foo', {    configurable: false,    value: 10,    writable: false})const p = new Proxy(obj, {    get(target, prop){        return 20;    }})console.log(p.foo);

登录后复制

set

  handler.set 用于监听目标对象的所有属性赋值行为。注意,如果目标对象自身的某个属性是不可写也不可配置的,那么 set 不得改变这个属性的值,只能返回同样的值,否则报错。

const obj = {};const p = new Proxy(obj, {    set(target, prop, value){        console.log(`Setting value "${value}" on the key "${prop}" in the target object`);        target[prop] = value;        return true;    }})p.foo = 1;  // Setting value "1" on the key "foo" in the target object

登录后复制

apply

handler.apply , Proxy 也为作为目标对象的函数提供了监听其调用行为的属性。

const sum = function(...args) {  return args    .map(Number)    .filter(Boolean)    .reduce((a, b) => a + b);}const p = new Proxy(sum, {  apply(target, thisArg, args) {    console.log(`Function is being called with arguments [${args.join()}] and context ${thisArg}`);    return target.call(thisArg, ...args);  }})console.log(p(1, 2, 3));// Function is being called with arguments [1,2,3] and context undefined// 6

登录后复制

construct

  handler.construct, Proxy 也可以将类作为目标监听对象,并监听其通过 new 语句来生产新实例的行为,这同样可以使用再作为构造器的构造函数上。

class Foo{};const p = new Proxy(Foo, {    construct(target, args, newTarget){        return {arguments: args}    // 这里返回的结果会是 new 所得到的实例    }});const obj = new p(1, 2, 3);console.log(obj.arguments);  // [1, 2, 3]

登录后复制

创建可解除 Proxy 对象

用法:Proxy.revocable(target, handler) : (proxy, revoke)。

const obj = {foo: 10};const revocable = Proxy.revocable(obj, {    get(target, prop){        return 20;    }})const proxy = revocable.proxy;console.log(proxy.foo); // 20revocable.revoke();console.log(proxy.foo); // TypeError: Cannot perform 'get' on a proxy that has been revoked

登录后复制

Proxy.revocable(target, handler) 会返回一个带有两个属性的对象,其中一个 proxy 便是该函数所生成的可解除 Proxy 对象,而另一个 revoke 则是将刚才的 Proxy 对象解除的解除方法。

以上就是JavaScript中Proxy的详细介绍(代码示例)的详细内容,更多请关注【创想鸟】其它相关文章!

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

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

(0)
上一篇 2025年3月8日 01:16:58
下一篇 2025年3月3日 18:55:36

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

相关推荐

  • JavaScript中Object.create()的用法介绍

    本篇文章给大家带来的内容是关于JavaScript中Object.create()的用法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 Object.create(null) 创建的对象是一个空对象,在该对象上没有继承…

    编程技术 2025年3月8日
    000
  • JavaScript中Reflect的详细介绍(附示例)

    本篇文章给大家带来的内容是关于JavaScript中Reflect的详细介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 Reflect 是一个内置的对象,它提供可拦截JavaScript操作的方法。方法与代理…

    编程技术 2025年3月8日
    200
  • JavaScript中import的详解(附示例)

    本篇文章给大家带来的内容是关于javascript中import的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 import 语句用于导入由另一个模块导出的绑定。无论是否声明了 strict mode,导入…

    编程技术 2025年3月8日
    100
  • redux的核心讲解(代码示例)

    本篇文章给大家带来的内容是关于redux的核心讲解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 概念 redux是一种架构模式,可以和react、vue结合使用。 解决的问题 优雅地修改共享数据状态,避免状态…

    2025年3月8日
    200
  • Vue封装ajax的代码示例详解

    本篇文章给大家带来的内容是关于vue封装ajax的代码示例详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 HTML文件: Document 点击获取信息 {{ msg }} var vm=new Vue({ el: “…

    编程技术 2025年3月8日
    200
  • JavaScrip的常见面试题及答案总结

    本篇文章给大家带来的内容是关于javascrip的常见面试题及答案总结,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 一、请解释 JavaScript 中 this 是如何工作的。 首先:this 永远指向函数运行时所在的…

    编程技术 2025年3月8日
    200
  • JavaScript中let、var和const的区别及应用场景的介绍

    在javascript中,建议在使用变量和常量时声明变量名称(下面统称为“变量”)。var,let和const是在javascript中声明变量时使用的关键字,其中,let和const是ecmascript 2015采用的新声明方法的关键字…

    2025年3月8日
    200
  • JavaScript的历史对象是什么

    javascript的历史对象是 window 对象的一部分,表示用户访问过的url的数组集合;它是用来保存着用户上网的历史历史,从窗口被打开的那一刻算起。 本篇文章给大家介绍JavaScript的历史对象,让大家对History对象有一个…

    2025年3月8日
    200
  • JavaScript提供的Cookie属性有哪些

    javascript提供的cookie属性有:expires属性(声明cookie的到期时间),max-age属性(声明cookie活动的最大时间),domain属性(定义有效域名),path属性。 Cookie是什么? Cookie是服务…

    2025年3月8日
    200
  • JavaScript 提升(Hoisting)是什么

    hoisting是javascript 中的一种机制,它可以将变量和函数的声明移到最顶部;让我们可以在声明它们之前使用变量和函数,也就是说:让变量和函数可以先使用再声明。 本篇文章就给大家介绍JavaScript的提升机制(Hoisting…

    2025年3月8日 编程技术
    200

发表回复

登录后才能评论