Proxy

本系列属于阮一峰老师所著的ECMAScript 6 入门学习笔记


概述

Proxy原意是代理,可以理解为”代理器“。Proxy用于修改某些操作的默认行为,等同于在语言层面做出修改,属于一种”元编程“(meta programming),即对编程语言进行编程。

var obj = new Proxy({},{
  get: function(target,key,receiver){
    console.log(`getting ${key}!`)
    return Reflect.get(target,key,receiver)
  },
  set: function(target,key,value,receiver){
    console.log(`setting ${key}!`)
    return Reflect.set(target,key,value,receiver)
  }
})

obj.count = 1 // setting count!
++obj.count // getting count! settting count!

// Proxy构造函数,用来生成Proxy实例
var proxy = new Proxy(target,handler) // target表示拦截的目标对象,handle参数也是一个对象,用来定制拦截行为

// 设置object.proxy属性,在object对象上调用
var object = {proxy: new Proxy(target,handler)}

// 作为对象的原型对象调用
var proxy = new Proxy({},{
   get: function(target,property){
      return 35
   }
})
let obj = Object.create(proxy)
obj.time // 35

Proxy拦截操作方法一共13种:

  • get(target,propKey,receiver) :拦截对象属性的读取,如proxy.foo
  • set(target,propKey,value,reveiver) :拦截对象属性的设置,返回一个布尔值,如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) ,返回一个数组。该方法返回目标对象所有自身属性的属性名,而Obejct.keys()的返回结果仅包括目标对象自身的可遍历属性
  • getOwnPropertyDescroptor(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.getPrototype(proxy) ,返回一个对象
  • isExtensible(target) :拦截Object.isExtensible(proxy) ,返回一个布尔值
  • setPrototypeOf(target,proto) :拦截Object.setPrototypeOf(proxy,proto) ,返回一个布尔值,如果目标对象是函数,那么还有两种额外操作可以拦截。
  • apply(target,object,args) :拦截Proxy实例作为函数调用的操作,比如proxy(...args)proxy.call(objcet,...args)proxy.apply(...)
  • construct(target,args) :拦截Proxy实例作为构造函数调用的操作,比如proxy(...args)
posted @ 2017-10-19 11:39  coderAngus  阅读(179)  评论(0)    收藏  举报