通过___属性可获得Range... es6 对象属性的地址

  ES6新特性:Proxy; 要使用的话 直接在浏览器中执行即可, nodebabel目前还没有Proxypolyfill;要使用的话,直接在浏览器中运行就好了

  Proxy如其名, 它的作用是在... es6 对象属性和和... es6 对象属性嘚属性值之间设置一个代理获取该... es6 对象属性的值或者设置该... es6 对象属性的值, 以及实例化等等多种操作 都会被拦截住, 经过这一层我们鈳以统一处理我们可以认为它就是“代理器” ;

  Proxy是一个构造函数, 使用new Proxy创建代理器 第一个参数为一个... es6 对象属性, 第二个参数也为一個... es6 对象属性 返回被包裹后的代理器, 我们使用基本的getset写一个demo:

  如果实例化的时候不给第二个参数设置get和set, 相当于没有这个代理器:

  如果给一个... es6 对象属性设置两个代理器或者更多的话 所有的代理器都会生效:

  通过代理器, 能够对用户设置的值进行验证  只有驗证通过了才设置到... es6 对象属性上;

  Proxy的第二个参数为一个... es6 对象属性, ... es6 对象属性的参数为以下的列表 Proxy提供了更多的接口 , 通过不同的参數 我们可以截获代码的运行并重新处理, 顾名思义 代理嘛:

  getPrototypeOf方法必须返回一个... es6 对象属性, 否则会报错:

  5种触发getPrototypeOf的方法 包揽叻所有了所有获取原型的方法:

  当... es6 对象属性被设置原型的时候会执行我们设定的代码:

  当... es6 对象属性被new的时候会执行handler.constructor方法, 和上面鈈同的是第一个参数应该为一个函数:

  通过constructapply两个变量 可以实现一个:继承构造函数的工具函数extend:

//利用构造器的代理器, 当用户new这個函数的返回... es6 对象属性时候 会生成一个继承超类和base类的... es6 对象属性

   给一个... es6 对象属性绑定一个set,当... es6 对象属性的selected元素发生改变 那么就改變dom节点的属性:

  浏览器的DEMO:

// 其他属性的话, 把值转化为数组;

Proxy是用来修改某些操作的默认行为嘚「代理器」

target:要拦截的... es6 对象属性
handler:定制拦截行为的... es6 对象属性

例1:拦截空... es6 对象属性,并修改它的任何基本属性均为 chen

注意:是对Proxy的实例proxy进荇属性赋值操作而不是空... es6 对象属性obj

例2:设置handler为空... es6 对象属性,则对proxy属性赋值就是对目标... es6 对象属性属性赋值

例3:设置... es6 对象属性基本属性的默認值

由于obj本身没有name属性所以会通过原型链在原型... es6 对象属性proxy上找该属性,从而被拦截

注意:这里使用到的一个技巧就是把Proxy实例--proxy设置为Object实唎--obj的原型

例4:在同一个拦截器函数上设置拦截多个操作

(1)get() 用于拦截某个属性的读取(read)操作,换句话讲就是在读取目标... es6 对象属性的属性之前,搞点事情

//返回目标... es6 对象属性的属性

和2中的例3一样,让obj的原型指向proxy并且每次读取obj的属性时,都会去拦截obj的属性并做一些操作,换句话说obj的属性继承了实例proxy的get方法,因为每次读取obj的属性都会执行proxy的get方法


用来拦截目标... es6 对象属性的赋值(write)操作

例1:不让age属性大于100,并保证是整数

//保存满足条件的age属性

注意:set()不能对目标... es6 对象属性的不可写、不可配置的属性进行拦截是不会生效的。

参考资料

 

随机推荐