返回顶部
首页 > 资讯 > 前端开发 > JavaScript >js Proxy的原理详解
  • 679
分享到

js Proxy的原理详解

2024-04-02 19:04:59 679人浏览 薄情痞子
摘要

目录什么是代理模式 引入一个现实生活中的案例结合案例理解代理模式的定义什么是Proxyget(target, propKey, receiver) set(target, propK

什么是代理模式

引入一个现实生活中的案例

我们作为用户需要去如何评估一个房子的好坏、如何办理住房手续等一些列繁琐的事物吗?显然,用户肯定不愿意这样做。用户最关心的是结果,用户对房子提出需求以及提供对等价值的金钱就可以获得满意的房子,这就是结果。

那么谁为用户去解决一系列繁琐的买房过程呢?当然就是“房屋中介”了!房屋中介的作用就是在房地产开发经营与消费的供求市场中,为交易物体提供评估、交易、代理、咨询等服务及善后服务的机构。

结合案例理解代理模式的定义

在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式就是为其他用户提供一种代理,用户不用知道买房的具体过程,而用户应该关心的是如何获得满意的结果,代理所需要做的事情就是完成这一买房的过程。

什么是Proxy

Proxy支持的拦截操作有许多中,目前只针对get(target, propKey, receiver)和set(target, propKey, value, receiver)来讲。

  • get方法:拦截对象属性的读取;
  • set方法:拦截对象属性的设置。

get(target, propKey, receiver)

定义一个Person对象,它将被Proxy代理,外界通Proxy实例对象来访问Person对象。


var person = {
    name: "kongsam",
    age: 21,
    hobbies: [
        "看动漫",
        "骑行",
        "玩游戏"
    ]
}

实例化一个Proxy对象,用于拦截外界对Person对象的操作。


var proxy = new Proxy(person, {
    get: function (target, property) {
          // 打印target和property,查看里面到底是什么。
          console.log("target = ", target);
          console.log("property = ", property);
          // 判断外界访问的对象属性是否存在于目标对象中。
          if (property in target) {
                return target[property];
          } else {
                // 如果外界访问的对象属性不存在与目标对象中,抛出异常。
                throw new ReferenceError('Property "' + property + '" 不存在。');
          }
    },
});

当进行proxy.name操作时,由于Person对象已经被Proxy代理了,所以每当我通过该Proxy实例对象访问Person中存在的属性时,都会调用get方法,get方法是拦截对象属性的读取的。

get: function (target, property) 中的两个参数target和property分别接收到的信息如图所示

通过该代理对象访问Person对象中存在的属性不会出现任何异常,如果访问不存在的属性会发生什么?

是什么,以至于访问不存在的属性时,它会抛出异常呢?

这是因为外界对Person对象的访问都必须先通过Proxy设置的拦截层,而拦截层提供了一种机制可以对外界的访问进行过滤和改写。


// 判断外界访问的对象属性是否存在于目标对象中。
if (property in target) {
    return target[property];
} else {
    // 如果外界访问的对象属性不存在与目标对象中,抛出异常。
    throw new ReferenceError('Property "' + property + '" 不存在。');
}

if语句就是拦截层的具体操作,即对外界的访问进行过滤和改写。如果没有,访问不存在的属性就会返回undefined。

set(target, propKey, value, receiver)

依旧是Person对象,这时我有个新需求,即修改age属性时,值不能超过150且是整数。

新增Proxy对象中的set方法。


var proxy = new Proxy(person, {
    set: function (target, property, value) {
          // 打印target、property和value,查看里面到底是什么。
          console.log("target = ", target);
          console.log("property = ", property);
          console.log("value = ", value);
          if (property === "age") {
                if (!Number.isInteger(value)) {
                  throw new TypeError("age的值不是整数!");
                }
                if (value > 150) {
                  throw new RangeError("age的值不能大于150!");
                }
          }
    },
});

当我执行proxy.age = 100时,set的三个参数分别接收到的信息如下图所示。

set方法用于拦截某个属性的赋值操作,我如果对age的赋值操作不满足条件时,会发生什么?

很明显,会抛出异常。

总结

Proxy就是拦截层,你给出被拦截的对象,外界访问这个对象必须先通过拦截层,即访问Proxy的实例对象。通过Proxy为外界访问进行过滤和改写,如赋值时需满足某些条件。

代理对象中还有许多的方法,如has、deleteProperty、ownKeys、getOwnPropertyDescriptor等,都是用于拦截不同的情况而出现的。

以上就是js Proxy的原理详解的详细内容,更多关于js Proxy的资料请关注编程网其它相关文章!

--结束END--

本文标题: js Proxy的原理详解

本文链接: https://lsjlt.com/news/126758.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • js Proxy的原理详解
    目录什么是代理模式 引入一个现实生活中的案例结合案例理解代理模式的定义什么是Proxyget(target, propKey, receiver) set(target, propK...
    99+
    2024-04-02
  • js中Proxy的原理分析
    这篇文章给大家分享的是有关js中Proxy的原理分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是代理模式引入一个现实生活中的案例我们作为用户需要去如何评估一个房子的好坏、如何办理住房手续等一些列繁琐的事物...
    99+
    2023-06-15
  • Javascript对象及Proxy工作原理详解
    正文 这一章其实算是javascript的科普文章,其实这本书的读者一般都不会是入门者,因此按道理说应该不需要再科普才对。但是作者依旧安排了这一章,证明就是这一章内容与我们以为的对象...
    99+
    2022-11-13
    Javascript对象Proxy Javascript Proxy
  • 详解VUE中的Proxy代理
    Proxy 是ES6中提供的一个非常强大的功能,可以用来代理另一个对象,从而拦截、监视并修改这个对象的各种操作 首先是Proxy()的参数: arget:被代理的对象。handler...
    99+
    2023-05-16
    VUE Proxy代理
  • JS 中Proxy代理和 Reflect反射方法示例详解
    目录正文1.属性描述符2.Reflect3.Proxy3.1 创建空代理3.2 定义捕获器3.3 捕获器不变式3.4 可撤销代理4.代理捕获器与反射方法4.1 get()4.2 se...
    99+
    2022-11-13
    JS Proxy代理Reflect反射 JS 代理反射
  • Golang实现gRPC的Proxy的原理解析
    背景 gRPC是Google开始的一个RPC服务框架, 是英文全名为Google Remote Procedure Call的简称。 广泛的应用在有RPC场景的业务系统中,一些架构中...
    99+
    2024-04-02
  • 实例详解vue中的代理proxy
    目录问题复习一下跨域的解决方案原理场景扩展几个常用的devServer配置扩展几个vue/cli3的配置问题 我们本地调试一般都是 npm run serve,然后打开 本机ip:8...
    99+
    2023-02-17
    vue代理proxy vue代理
  • Java 代理(Proxy)的原理及应用
    目录一、代理的概念二、java中的代理2.1、"java.lang.reflect.Proxy"类介绍2.2、编写生成代理对象的类三、动态代理应用3.1、在字符过滤器中使用动态代理解...
    99+
    2024-04-02
  • 详解Java的Proxy动态代理机制
    目录一、Jvm加载对象二、代理模式2.1、基本描述2.2、静动态模式三、静态代理四、动态代理4.1、场景描述4.2、基础API案例4.3、代理类结构4.4、JDK源码五、源代码地址一...
    99+
    2024-04-02
  • JS中ES6代理Proxy怎么用
    这篇文章主要为大家展示了“JS中ES6代理Proxy怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS中ES6代理Proxy怎么用”这篇文章吧。proxy...
    99+
    2024-04-02
  • JavaScript的Proxy对象详解
    目录一、Proxy 是什么?二、怎么用?1、使用 Proxy 的简单实例2、目标对象被正确修改3、使用 set handler 做数据验证4、扩展构造函数总结一、Proxy 是什么?...
    99+
    2024-04-02
  • 详解Java Proxy动态代理机制
    一、Jvm加载对象 在说Java动态代理之前,还是要说一下Jvm加载对象的过程,这个依旧是理解动态代理的基础性原理: Java类即源代码程序.java类型文件,经过编译器编译之后就...
    99+
    2024-04-02
  • vue跨域proxy代理配置详解
    目录引言例一例二总结引言 相信很多人都用过proxy,这里就不多说proxy的基本使用,这里要说一下很多人使用proxy的一个误区,大家一般都是直接将管官方的例子拿过来,修改一下代理...
    99+
    2024-04-02
  • MVC+proxy的原理及使用方法
    这篇文章主要讲解了“MVC+proxy的原理及使用方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MVC+proxy的原理及使用方法”吧!目录创建业务层UserService接口定义需要完...
    99+
    2023-06-20
  • 详细了解MVC+proxy
    目录1、创建业务层UserService接口定义需要完成的功能2、创建持久层UserDao接口定义具体的CURD3、完成UserService接口和UserDao的实现类4、创建In...
    99+
    2024-04-02
  • 详解Js模块化的作用原理和方案
    目录一、模块化概念二、模块化作用三、模块化历程1、普通写法(全局函数及变量)2、对象封装3、匿名函数方式四、模块化方案1、CommonJS2、AMD3、CMD4、ES6 module...
    99+
    2024-04-02
  • 详解MD5算法的原理以及C#和JS的实现
    目录一、简介二、C# 代码实现三、js 代码实现一、简介 MD5 是哈希算法(散列算法)的一种应用。Hash 算法虽然被称为算法,但实际上它更像是一种思想。Hash 算法没有一个固定...
    99+
    2023-03-19
    C# MD5算法 JS MD5算法 MD5算法实现
  • vue3简易实现proxy代理实例详解
    vue3 简易实现proxy代理 1.基础数据 const state = reactive({ name: 'cld', age: 26, like: 'paint' }); co...
    99+
    2024-04-02
  • js中Proxy一定要配合Reflect使用的原因是什么
    这篇文章主要介绍“js中Proxy一定要配合Reflect使用的原因是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“js中Proxy一定要配合Reflect使用的原因是什么”文章能帮助大家解决问...
    99+
    2023-06-29
  • Qiankun原理详解JS沙箱是如何做隔离
    目录前言复习一下沙箱SanpshotSandboxLegacySandboxProxySandbox隔离原理XXX is undefined总结前言 相信大家也知道 qiankun ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作