Proxy代理简单了解

Proxy在JavaScript中用于创建一个对象的代理,从而修改默认行为,实现元编程。它可以在访问目标对象时进行拦截,如属性读取、设置、属性存在检查等操作。使用Proxy时必须对实例对象而非目标对象操作。常见的Proxy操作包括get、set、has、deleteProperty、ownKeys等,广泛应用于数据绑定、对象权限控制等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Proxy用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种’元编程’,即对编程语言进行编程.

Proxy可以理解成,在目标对象之前假设一层拦截,外界对该对象的访问,都必须先通过这层拦截,一次提供了一种机制,可以对外界的访问进行过滤和改写.Proxy这个词的原意是代理,用在这里表示由它来’代理’某些操作,可以译为’代理器’.

Proxy对象的常用解构组成:

let proxy=new Proxy(target,handler);
>>target:表示需要被代理的目标对象

>>handler:也是一个对象,对象中分别存在两个属性方法:getset

>>>> get属性方法用于拦截某个属性的读取操作

>>>> set属性方法用于拦截某个属性的设置操作

handler:{
	get(target,_prop,_proxy){
		// target:表示被代理的对象
		// _prop:表示读取的被代理对象的属性
		// _proxy:可选参数,表示Proxy实例对象
	},
	set(target,_prop,_value,_proxy){
		// target:表示被代理的对象
		// _prop:表示设置的被代理的对象的属性
		// _value:表示设置的值
		// _proxy:可选参数,表示Proxy实例对象
	}
}

注意:

要使得Proxy起作用,必须针对Proxy实例对象进行操作,而不是针对目标对象(被代理对象)进行操作。

简单案例:

/** 对象代理 **/

// 创建一个对象person(被代理的对象)
const person={
	name:'XiaoMei',
	age:29,
	sex:'女',
	address:"江苏南京"
}

// 创建一个Proxy实例对象代理person
const proxyPerson=new Proxy(person,{
	get(target,_prop){
        // 设置需要获取年龄时,一律返回18
		return _prop==='age'?18:target[_props];
	},
    set(target,_prop,_value){
        // 当设置address属性,且属性值中含有 '北京' 字符时,该属性保持不变
        if(_prop==='address'&&_value.indexOf('北京')!=-1){
            return;
        }
        return (target[_prop] = _value);
    }
})

proxyPerson.address='福建厦门';
console.log(person); // {name:'XiaoMei',age:30,sex:'女',address:'福建厦门'};

proxyperson.address='中国北京';
console.log(person); // {name:'XiaoMei',age:30,sex:'女',address:'江苏南京'};

console.log(proxyPerson.age); // 18
console.log(proxyPerson.name); // XiaoMei

/** 数组代理 **/

const list=['Hello',true,2020];

const listProxy=new Proxy(list,{
	get(target,_prop){
		return _prop>target.length-1?'暂无数据':target[_prop];
	},
    set(target,_prop,_value){
        if(target.includes(_value)){
            console.log('数据已经存在');
            return;
        }
        console.log('插入成功')
        return target.push(_value);
    }
})

console.log(listProxy[3]); // 暂无数据
console.log(listProxy[2]); // 2020

listProxy[listProXy.length]=1; // 插入成功

listProxy[listProxy.length]='Hello';

Proxy支持拦截的操作

get(target, _prop, _proxy):

拦截被代理对象属性的读取,比如proxy.fooproxy['foo']

set(target, _prop, _value,_proxy)

拦截对象属性的设置,比如proxy.foo = vproxy['foo'] = v,返回一个布尔值。

has(target, _prop)

拦截 _prop in proxy`的操作(即拦截判断指定属性是否属于指定对象的操作),返回一个布尔值。

deleteProperty(target, _prop)

拦截delete proxy[_prop]的操作,返回一个布尔值。

ownKeys(target)

拦截Object.getOwnPropertyNames(proxy)Object.getOwnPropertySymbols(proxy)Object.keys(proxy)for...in循环,返回一个数组。该方法返回目标对象所有自身的属性的属性名,而Object.keys()的返回结果仅包括目标对象自身的可遍历属性。

getOwnPropertyDescriptor(target, _prop)

拦截Object.getOwnPropertyDescriptor(proxy, _prop),返回属性的描述对象。

defineProperty(target, _prop, propDesc):

拦截Object.defineProperty(proxy, _prop, propDesc)Object.defineProperties(proxy, propDescs),返回一个布尔值。

preventExtensions(target)

拦截Object.preventExtensions(proxy),返回一个布尔值。

getPrototypeOf(target):

拦截Object.getPrototypeOf(proxy),返回一个对象。

isExtensible(target):

拦截Object.isExtensible(proxy),返回一个布尔值。

setPrototypeOf(target, proto):

拦截Object.setPrototypeOf(proxy, proto),返回一个布尔值。如果目标对象是函数,那么还有两种额外操作可以拦截。

apply(target, object, args)

拦截 Proxy 实例作为函数调用的操作,比如proxy(...args)proxy.call(object, ...args)proxy.apply(...)

construct(target, args):

拦截 Proxy 实例作为构造函数调用的操作,比如new proxy(...args)

在 nodejs 中使用代理是非常常见的。Proxy 代理分为正向代理和反向代理。在使用 Proxy 代理时,我们可以传递参数。下面将详细介绍 Proxy 代理传递参数的方法。 首先需要了解的是,代理的使用需要使用第三方模块,最常见的有 http-proxy、request、socket.io、bouncy 等。这里以使用 http-proxy 为例。 用法如下: ```javascript var http = require('http'), httpProxy = require('http-proxy'); var proxy = httpProxy.createProxyServer({}); http.createServer(function(req, res) { proxy.web(req, res, { target: 'http://localhost:9000' }); }).listen(8000); ``` 上面的代码中,我们创建了一个 httpProxy 对象,然后设置代理服务器的地址。当客户端请求 web 服务器时,httpProxy 对象会将请求转发给代理服务器。 要传递参数,我们可以在 proxy.web() 方法的第三个参数中设置进去。比如: ```javascript var http = require('http'), httpProxy = require('http-proxy'); var proxy = httpProxy.createProxyServer({}); http.createServer(function(req, res) { proxy.web(req, res, { target: 'http://localhost:9000', headers: { 'X-Custom-Header': 'foobar' } }); }).listen(8000); ``` 上面的代码中,我们在 proxy.web() 方法的第三个参数中添加了一个 headers 属性,用来设置请求头部信息。 除了 headers 属性之外,还有 pathRewrite、agent 属性等,都可以用来传递参数。具体使用方法与 headers 属性类似,在第三个参数中设置属性即可。 总之,使用 Proxy 代理传递参数非常简单,在第三个参数中设置相关属性即可。这样可以更加灵活地使用代理,实现更多的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值