深入浅出 proxy 系列之一:Proxy 是什么

1. 理解proxy

1.1 类还是函数

proxy 是 ES6 中新增的一个函数,也可以叫类,但是 js 中一切皆是函数,即使使用 class 定义的类,最终也是函数,所以我们还是称其为函数吧,虽然我更喜欢称其为类,因为这更符合我后端背景

1.2 为什么没有原型对象

console.log(Proxy.prototype); // undefined

我只是好奇试了一下,果然发现了特殊之处:作为一个构造函数,为什么没有原型对象?

这是 ECMA 的官方说明

由于 Proxy 构造出来的实例对象是对目标对象的一个代理,所以 Proxy 在构造过程中是不需要 prototype 进行初始化的

因为其他构造函数之所以需要 prototype,是因为构造出来的对象需要一些初始化的成员,所以将这些成员定义到了 protoype 上

Proxy 只是用来代理其他对象,就好比平时的烟酒代理,其本身并不具备生产能力,所以啥也没有任何的设备和工艺,任何人有个门脸都可以开一个

1.3 确实是个代理

Proxy 确实很多方面,都跟烟酒代理一样

比如茅台酒的代理,有了这个代理,我们就不能直接从茅台公司拿酒,必须通过这个代理

代理说多少钱,就是多少钱,代理说没有就没有

Proxy 代理的是一个对象,这个对象被代理之后,我们就不能直接访问这个对象了,必须通过代理访问。

比如像获取某个属性的值,代理说没有就没有,代理想给你返回啥值就返回啥值

代码演示

// 创建了一个对象,将来被proxy代理
let person = {
  name: 'yhb'
}
// 创建了一个对象,当通过代理访问目标对象时,此对象中的对应
// 方法会执行
let handler = {
  get (target, prop) {
    return '哈哈,我是代理,我说什么价就是什么价'
  }
}
// 创建代理,指定代理对象和代理对象操作对象
let py1 = new Proxy(person, handler)
console.log(py1.name);
console.log(py1.age);

当通过代理访问 person 对象的 name 和 age  属性时,会触发 handler 对象的 get 属性指定的函数

此函数有两个参数

  • target :目标代理对象,也就是 person
  • prop:访问的属性

此函数返回什么,外界最终获取的就是什么

返回属性的值

如果想返回 person 对象中的 nage 和 age 属性实际的值,只需要将代码改成这样

 get (target, prop) {
    return target[prop]
  }

什么都不返回呢?

如果 get 函数改成这样

get (target, prop) {

  }

则访问任何属性的结果都为 undefined

总结:是不是很像现实中的代理,或者汽车 4S 店

  • 不管你要什么,我说有就有,说没有就没有
  • 我说多少钱就是多少钱

1.4 为什么要有代理

原因上,与以前的 Object.defineProperty 方法一样,就是不希望用户直接访问某个对象,直接操作对象的某个成员,通过代理,用户的访问首先被代理拦截,拦截住后就可以对数据进行处理,比如验证等

 

 

 

  • 34
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巴山却话

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值