博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js-ES6学习笔记-Proxy(2)
阅读量:7049 次
发布时间:2019-06-28

本文共 1308 字,大约阅读时间需要 4 分钟。

1、has方法用来拦截HasProperty操作,即判断对象是否具有某个属性时,这个方法会生效。典型的操作就是in运算符。

var handler = {  has (target, key) {    if (key[0] === '_') {      return false;    }    return key in target;  }};var target = { _prop: 'foo', prop: 'foo' };var proxy = new Proxy(target, handler);'_prop' in proxy // false

上面代码中,如果原对象的属性名的第一个字符是下划线,proxy.has就会返回false,从而不会被in运算符发现。

2、如果原对象不可配置或者禁止扩展,这时has拦截会报错。也就是说,如果某个属性不可配置(或者目标对象不可扩展),则has方法就不得“隐藏”(即返回false)目标对象的该属性。

3、has方法拦截的是HasProperty操作,而不是HasOwnProperty操作,即has方法不判断一个属性是对象自身的属性,还是继承的属性。另外,虽然for...in循环也用到了in运算符,但是has拦截对for...in循环不生效。

4、construct方法用于拦截new命令,下面是拦截对象的写法。

var handler = {  construct (target, args, newTarget) {    return new target(...args);  }};

construct方法返回的必须是一个对象,否则会报错。

5、deleteProperty方法用于拦截delete操作,如果这个方法抛出错误或者返回false,当前属性就无法被delete命令删除。

6、defineProperty方法拦截了Object.defineProperty操作。

7、getOwnPropertyDescriptor方法拦截Object.getOwnPropertyDescriptor,返回一个属性描述对象或者undefined

8、getPrototypeOf方法主要用来拦截Object.getPrototypeOf()运算符,以及其他一些操作。

  • Object.prototype.__proto__
  • Object.prototype.isPrototypeOf()
  • Object.getPrototypeOf()
  • Reflect.getPrototypeOf()
  • instanceof运算符

getPrototypeOf方法的返回值必须是对象或者null,否则报错。另外,如果目标对象不可扩展(extensible), getPrototypeOf方法必须返回目标对象的原型对象。

9、虽然 Proxy 可以代理针对目标对象的访问,但它不是目标对象的透明代理,即不做任何拦截的情况下,也无法保证与目标对象的行为一致。主要原因就是在 Proxy 代理的情况下,目标对象内部的this关键字会指向 Proxy 代理。

 

转载地址:http://aldol.baihongyu.com/

你可能感兴趣的文章
Android之ContentProvider源码解析
查看>>
单元测试问题一览
查看>>
打造 Laravel 优美架构 谈可维护性与弹性设计
查看>>
新手路:用node js和mongodb数据库创建AJAX API接口
查看>>
如何获得C4C里某个code字段对应的描述信息
查看>>
elasticsearch -- 基础入门 -- 请求体查询 -- 最重要的查询
查看>>
MCPlayerKit 易用的播放组件,通用播放器
查看>>
报错xxxx of undefined
查看>>
配置HTTPS,公钥证书有效期短怎么办?
查看>>
重新学习web后端开发-004-了解http响应
查看>>
js判断微信内核浏览器
查看>>
原生JS发请求
查看>>
数字签名信息安全
查看>>
项目打包优化
查看>>
力扣(LeetCode)417
查看>>
199. Binary Tree Right Side View
查看>>
PHP_SELF变量解析和重复路径解决
查看>>
JS每日一题:什么情况下适合使合vuex?Vuex使用中有几个步骤?
查看>>
原来实现GCP用客户端登录这么简单啊
查看>>
JS每日一题: 请简述一下vuex实现原理
查看>>