当前位置:首页 > CN2资讯 > 正文内容

JavaScript的Proxy代理

3天前CN2资讯


proxy代理,就是在目标对象的前面设置一个拦截层,外界在访问这个对象的时候,必须经过拦截层。
我们可以在拦截层做一些过滤或者是改写的操作。

const proxy = new Proxy({}, {
get: () => {
console.log("get");
},
set: () => {
console.log("set")
}
})

proxy.count = 1; // set
++proxy.count; // get

Proxy接受两个参数,第一个参数是拦截目标对象;第二个参数是设置拦截的操作,所谓的拦截,一般都是有一些操作行为的,如果在拦截层没有设置任何操作的话,就会直接访问目标对象。

Proxy支持的拦截操作

get(target,propkey,receiver)

拦截对象的读取属性操作。

const proxy = new Proxy({ name: "duXin", count: 90 }, {
get: () => {
console.log("get");
return 100
},
})

console.log(proxy.name)

在访问目标对象的时候,无论是name属性还是count属性,都会返回100,因为在拦截层设置读取属性时都返回100。

set()

方法是设置属性值操作的捕获器。

const proxy_set = new Proxy({}, {
set: function (target, prop, value,) {
target[prop] = value;
console.log('property set: ' + prop + ' = ' + value);
return true;
}
})

console.log("======proxy_set=======")
console.log('name' in proxy_set); // false
proxy_set.name = 'duXin'; // property set: name = duXin

console.log('name' in proxy_set); // true
has()

对in操作符的代理方法。

const targetObj = {
_secret: 'easily scared',
eyeCount: 4
};
const proxy_has = new Proxy(targetObj, {
has: (target,) => {
console.log("key==",key)
if (key.includes('_')) {
return false;
}
return key in target;
}
})

console.log('eyeCount' in targetObj); // true
console.log('_secret' in proxy_has); // false
construct()

拦截new操作符,返回的是一个对象。

function proxy_construct_obj(disposition){
this.disposition = disposition;
}
const proxyConstruct = new Proxy(proxy_construct_obj, {
construct: function (target,) {
return new target(...args);
}
})

console.log(new proxyConstruct("duXinYue").disposition)
apply()

拦截函数的调用。
语法:

var p = new Proxy(target, {
apply: function(target, thisArg,) {
}
});

target:目标对象,也就是函数
thisArg:被调用时的上下文对象
argumentsList:被调用时的参数,是一个类数组。

声明一个函数:

function sum(a,) {
return a + b;
}const proxy_apply = new Proxy(sum, {
apply: (target,thisArg,) => {
console.log("target",target,thisArg, argumentsList)
return target(argumentsList[0], argumentsList[1]) * 10;
}
})

console.log(proxy_apply(1,2)); //30
defineProperty()

拦截对象的 Object.defineProperty() 操作符。
这是语法:
​​​defineProperty: function(target, property, descriptor) {}​​​ target:目标对象,
property:被检索的属性名
descriptor:待定义或者修改的属性的描述符

defineProperty的返回值必须是Boolean值,表示对该属性操作是否成功。

var desc = { configurable: true, enumerable: true, value: 10 };
var defineProperty = new Proxy(desc, {
defineProperty: function (target, prop,) {
console.log('called: ' + prop);
Reflect.defineProperty(target, prop, descriptor);
}
});

defineProperty.name = "908"
console.log("obj", defineProperty); // { configurable: true, enumerable: true, value: 10, name: '908' }


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/25021.html

    分享给朋友:

    “JavaScript的Proxy代理” 的相关文章

    美国CN2200g防御:守护您的健康秘密

    当然可以!以下是关于“美国CN2200g防御”的软文:在快节奏的现代生活中,人们的健康问题日益受到关注。尤其是在环境污染、不良生活习惯和饮食不规律的影响下,身体免疫力的下降成为了许多人的困扰。而此时,一款名为“美国CN2200g防御”的产品,正逐渐成为健康领域的热门话题。它以独特的配方和显著的效果,...

    提升科研效率:1536微量高速离心机及其应用

    产品概述与特点 在实验室的工作中,设备的效率通常会直接影响到实验的结果。1536微量高速离心机就是这样一款能够大大提高离心效率的设备。它能够处理1.5ml和2.0ml的离心管、8连管、PCR管以及5ml管,极大地方便了科学研究中的样品处理流程。产品的设计充分考虑了用户的使用需求,具备了最高15,00...

    APT攻击是什么及其防御措施详解

    APT攻击(Advanced Persistent Threat,高级持续性威胁)是一种复杂而长期的网络攻击模式。在我了解这个概念的过程中,逐渐意识到它不仅仅是一种攻击手段,而是一个精密的、组织化的网络战争策略。APT攻击的敌对方通常具备高超的技术能力和丰富的资源,他们的目标是破坏组织的核心设施,或...

    国内到东京快还是首尔快网络速度对比分析

    引言 在这个数字化快速发展的时代,网络速度对我们生活的影响越来越显著。很多时候,我们的工作、学习和娱乐都离不开稳定的网络连接。尤其是当我们考虑访问国外网站或进行国际交流时,网络速度的重要性更是无法忽视。今天,我想带大家探讨国内到东京和首尔的网络速度比较,看看这两个城市的网络表现究竟有何不同。 为什么...

    便宜的国外主机推荐:性价比高的主机选择指南

    在选择国外主机服务时,价格通常是一个重要的考量因素。面对纷繁复杂的选择,我发现一些便宜且性能不错的国外主机服务,让我大为惊喜。这里,我想和大家分享几款我认为性价比非常高的国外主机。 首先,我接触到UCloud。它的起售价为34元一个月,提供包括云服务器、GPU服务器和裸金属服务器在内的多种产品。这种...

    RackNerd在纽约的数据中心服务与优势

    RackNerd在纽约的数据中心的服务确实引人关注。从基础服务到多样化的产品,RackNerd为各类客户提供了丰富的选择。我对于他们的虚拟主机和独立服务器十分赞赏。这些服务不仅安全可靠,而且具有灵活的配置选项,满足了各种不同需求的用户。对于初创企业或者需要特别高可用性的业务,选择RackNerd无疑...