范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

JavaScript之Proxy

  前言
  Proxy 可以理解成,在目标对象之前架设一层"拦截",外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理,用在这里表示由它来"代理"某些操作,可以译为"代理器"。 语法var proxy = new Proxy(target, handler);
  Proxy 对象的所有用法,都是上面这种形式,不同的只是handler参数的写法。其中: new Proxy()   表示生成一个 Proxy 实例target 参数表示所要拦截的目标对象 handler 参数也是一个对象,用来定制拦截行为
  如果handler没有设置任何拦截,那就等同于直接通向原对象。 let target = {}; let handler = {}; let proxy = new Proxy(target,handler); proxy.name = "编程三昧";  console.log(target.name); // "编程三昧"
  还有一个技巧是将 Proxy 对象,设置到  object.proxy   属性,从而在 object 对象上调用:let proxy = new Proxy({}, {   get: function(target, property) {     return 35;   } });  let obj = Object.create(proxy); obj.time // 35 get()
  get() 方法用于拦截某个属性的读取操作,可以接受三个参数,依次为: 目标对象 属性名 proxy 实例本身(严格地说,是操作行为所针对的对象),可选。
  get()   方法的用法,上文已经有一个例子,下面是另一个拦截读取操作的例子:let  perosn = {     name:"james",     age:26,     profession:"software" }  var proxy = new Proxy(perosn,{     get:function(target,property) {         if (property in target) {             return target[property];         } else {             throw new ReferenceError("propertype""+property + "" does no exit" );         }     } });  console.log(proxy.name,proxy.profession); // james software console.log(proxy.sex); // Uncaught ReferenceError: propertype"sex" does no exit set()
  set()   方法用来拦截某个属性的赋值操作,可以接受四个参数,依次为:目标对象 属性名 属性值 Proxy 实例本身,可选。
  假定 person 对象有一个 age 属性,该属性应该是一个不大于 200 的整数,那么可以使用 Proxy 保证 age 的属性值符合要求。 let perosn = {     name:"james",     age:26,     profession:"software" }  let proxy = new Proxy(perosn,{     get:function(target,property) {         if (property in target) {             return target[property];         } else {             throw new ReferenceError("propertype""+property + "" does no exit" );         }     },     set:function(target,key,value) {         if(key === "age") {             if(value>80) {                 throw ReferenceError("invail");             } else {                 return target[key] = value;             }         } else {             return target[key];         }     } }); proxy.age = 60; console.log(proxy.name,proxy.profession,proxy.age); // james software 60  proxy.age = 99; // Uncaught ReferenceError: invail apply()
  apply()   方法拦截:函数的调用 call 操作 apply 操作
  apply()   方法可以接受三个参数,分别是:目标对象 目标对象的上下文对象(this) 目标对象的参数数组。 let twice = {     apply(target, ctx, agrs) {         return Reflect.apply(...arguments) * 2;     } }; function sum (a, b) {     return a + b; } let proxy5 = new Proxy(sum, twice);  console.log(proxy5(1, 3));  // 8 console.log(proxy5.apply(null, [1, 3])); // 8
  另外,直接调用Reflect.apply方法,也会被拦截。 Reflect.apply(proxy5, null, [9, 10]) // 38 has()
  has()   方法用来拦截 HasProperty 操作,即判断对象是否具有某个属性时,这个方法会生效。典型的操作就是 in 运算符。
  has()   方法可以接受两个参数,分别是目标对象、需查询的属性名。
  下面的例子使用 has 方法隐藏某些属性,不被 in 运算符发现。 let stu1 = {name: "张三", score: 59}; let stu2 = {name: "李四", score: 99};  let handler = {   has(target, prop) {     if (prop === "score" && target[prop] < 60) {       console.log(`${target.name} 不及格`);       return false;     }     return prop in target;   } }  let oproxy1 = new Proxy(stu1, handler); let oproxy2 = new Proxy(stu2, handler);  "score" in oproxy1 // 张三 不及格 // false  "score" in oproxy2 // true  for (let a in oproxy1) {   console.log(oproxy1[a]); } // 张三 // 59  for (let b in oproxy2) {   console.log(oproxy2[b]); } // 李四 // 99
  上面代码中,has 拦截只对 in 运算符生效,对  for...in   循环不生效,导致不符合要求的属性没有被 for...in 循环所排除。Proxy 支持的拦截操作一览
  Proxy 支持的拦截操作基本有 13 种。 get(target, propKey, receiver)
  拦截对象属性的读取,比如: proxy.foo  proxy["foo"]  。set(target, propKey, value, receiver)
  拦截对象属性的设置,比如  proxy.foo = v   或 proxy["foo"] = v  ,返回一个布尔值。has(target, propKey)
  拦截  propKey in proxy   的操作,返回一个布尔值。deleteProperty(target, propKey)
  拦截  delete proxy[propKey]   的操作,返回一个布尔值。ownKeys(target)
  拦截: Object.getOwnPropertyNames(proxy)  Object.getOwnPropertySymbols(proxy)  Object.keys(proxy)  for...in   循环
  以上拦截都返回一个数组。
  该方法返回目标对象所有自身的属性的属性名,而  Object.keys()   的返回结果仅包括目标对象自身的可遍历属性。getOwnPropertyDescriptor(target, propKey)
  拦截  Object.getOwnPropertyDescriptor(proxy, propKey)  ,返回属性的描述对象。defineProperty(target, propKey, propDesc)
  拦截: Object.defineProperty(proxy, propKey, 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)  。
  ~
  ~ 本文完,感谢阅读!
  ~ 学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!
  大家好,我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教!

赵明回应美国可能将荣耀列入实体清单,透露将重回高端挑战苹果来源中国经济周刊经济网中国经济周刊经济网讯(记者孙冰)新荣耀重回高端的大杀器终于来了。8月12日,荣耀Magic3系列正式发布。Magic系列一直是荣耀探索未来的高端旗舰产品,于2苹果手机游戏评测今天看了很多网上游戏评测的视频,突然想到一个问题,为什么每一个评测的博主都只是简单的评测,每一次评测时间都不会超过半个小时,尤其是到了夏天温度比较高的时候这种评测有用吗?我只想说对不给苹果打工了!欧菲光1亿像素7P镜头已量产打入国产供应链随着智能手机摄像头像素的持续提高,光学镜头从初期的24片塑料镜头,发展到7P8P镜头。随着拍照的进一步升级,潜望式镜头TOF镜头等也开始逐步渗透,成为光学成长的新动力。据悉,欧菲光9月可能会鸽!苹果或将11月发布新款MacBook近日彭博社表示,由于今年的供应链短缺问题,新款的14英寸和16英寸MacBookPro可能将会在11月发布(而不是与iPhone13同步的9月),11月正好是16英寸MacBook苹果iPhone13系列迎来3大升级,国行版本5499元起,加量不加价?每年的秋季,都是各家手机厂商发布自家旗舰产品的黄金时间。其中关注度最高的可能就是华为苹果小米这几家手机厂商了。随着智能手机的不断发展,苹果的秋季发布会即将召开,发布会的时间很大可能骁龙865,骁龙870,骁龙860是什么东西?小米平板5,后摄很像小米11很有辨识度。小米最近推出了小米平板5搭载骁龙860处理器,8720mAh电池,支持33W快充,6128G仅需要1999备受追捧,那么骁龙860是什么处理数据安全法落地在即!魅族未雨绸缪!竟提前站上千亿市场风口为什么在某电商平台上的同一款产品,我买就要比别人更贵几块钱?原以为是别人是有优惠券,没曾想人家从搜索界面看到的价格就已经比我低了!为什么在某打车软件上,我打车总感觉比其他人要贵!是用科技描绘上古神力,华为山海经神兽主题背后的故事来源读特华为新上线了一套山海经神兽主题,把火龙鲲鹏麒麟青牛驳鸿鹄等六只上古神兽搬进了手机手表平板等设备,以丰富的色彩细腻的笔触,再现上古神兽的磅礴气势,也展现了华为设计师眼中神兽的字节诉争头条相关商标二审被驳回据天眼查APP显示,近日,北京字节跳动科技有限公司与国家知识产权局二审行政判决书公开,案号(2021)京行终3271号,审理法院为北京市高级人民法院。判决书显示,一审法院认为,字节苹果发布新版iCloudforWindows增加钥匙串密码管理应用苹果公司今天发布了新版iCloudforWindows应用,12。5版更新为Windows用户增加了新的iCloud钥匙串密码管理应用。使用新的密码管理选项,运行Windows的用三星员工炒比特币净赚2。3亿,直接炒老板鱿鱼据boss广播,三星一名员工的辞职信在韩国引起了热烈讨论。这名员工辞职的原因是,他通过投资虚拟货币获得了400多亿韩元(约2。3亿元)的净利润,因此他选择离开并享受生活。虽然还没有
阿里女员工愤怒,再次认识残酷的现实阿里女员工不公事件,再次践踏了底层群众的底线。冷静下来,阿里都如此,其他不如阿里的会比阿里高尚?还是阿段厉害,从二选一就品出了价值观,不是让天下没有难做的生意,而是在朕的天下没有难现在已经很少有非智能电视了,能否把智能电视刷成非智能电视?1,电脑显示器。2,打开电视后盖,如果是三块主板的,就直接把中间的电脑板扔了,信号直接给驱动板。如果只有一块,那就是三合一主板,直接扔了,自己买一块驱动板一块电源板插上就好。3,以壕无人性!王思聪百万电脑跑分亚洲第一,全球第四近日,撕聪邀请哔哩哔哩UP电丸科技配合安装了一台家用服务器,调试跑了下分,居然高达全球第四!网友调侃道这台配置如下储存与计算服务器型号DellR7525(拨号和网络服务器R740)二本4年经验,历经Android研发4面,成功跳进阿里,获60wOffer!7月初准备跳槽,先后面试了各大小公司,拿了一些offer,有阿里,滴滴,快手,达达,得物等公司。面试的公司大部分都能过,所以这里给大家分享下自己的经验,也给自己做个归档,希望能给正青少年模式侵犯未成年权益遭起诉?腾讯微信再迎整改网络热点年年有,今年尤其多。这不,腾讯又双叒叕摊上事儿了。近期,腾讯或被提起民事公益诉讼一事闹得沸沸扬扬。作为一家游戏巨头,腾讯暴利的游戏业务常常引发关于青少年教育问题的全民讨论。一台出色的2。0系统桌面音箱的多面性,创新T60初体验在笔者的心中,创新这个品牌绝对是桌面音箱领域里yyds,想当年攒得第一台电脑所花的钱,就有四分之一用来入手创新音箱,那时候高配置的电脑装机清单里,也总少不了有创新音箱。这么多年过去成中移动5G模组招标最大赢家,高通骁龙能力再获认可8月5日,中国移动公布2021年至2022年5G通用模组产品集中采购中标侯选人。据悉,本次招标总采购量为32万片,为目前国内运营商规模最大的5G产品集采项目,有助于推动5G普及5G为什么要进行职业教育改革?就是要解决有学历没技能的痛点液压式伺服冲压机扫描透射电子全息显微镜加氢反应器电波暗室这是我国尚未掌握的核心技术清单。而这只是我们国家卡脖子技术的一部分。在日前举办的第七届产教融合发展战略国际论坛上,一份当前我荣耀平板V7Pro也有平行视界,还能一屏四用IT之家8月10日消息荣耀此前官宣了荣耀平板V7Pro将与Magic3系列等一起在8月12日发布,该机将首发搭载联发科最新发布的迅鲲1300T芯片。今日,荣耀官方又发布宣传视频,这想体验真正的全面屏?那还得看中兴Axon30屏下版手机中国行情在大家现在对手机的审美中,手机的屏占比越高越好看,全面屏已经成为了手机行业的发展潮流,越来越多的消费者对屏幕顶端的刘海挖孔设计不满意。在全面屏手机这一块,中兴可以说是走173页Docker学习笔记,内容详尽讲解细致,仅分享三天如今Docker的使用已经非常普遍,特别在一线互联网公司。使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力。在云服务概念兴起之后,Docker的使用场景