es6 Proxy和Reflect

Proxy:
	用new创建一个和目标对象一直的虚拟化对象,然该代理中就可以拦截JavaScript引擎内部目标的底层对象的操作,这些底层操作被拦截后会触发响应特定操作的配置函数
	
	const p = new Proxy(target, {配置函数})
		配置函数:
		第一个参数都是target,即要代理的对象,其他参数查看官网
			https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy
		
		getPrototypeOf()
		    Object.getPrototypeOf 方法的捕捉器。
		setPrototypeOf()
		    Object.setPrototypeOf 方法的捕捉器。
		isExtensible()
		    Object.isExtensible 方法的捕捉器。
		preventExtensions()
		    Object.preventExtensions 方法的捕捉器。
		getOwnPropertyDescriptor()
		    Object.getOwnPropertyDescriptor 方法的捕捉器。
		defineProperty()
		    Object.defineProperty 方法的捕捉器。
		has()
		    in 操作符的捕捉器。
		get()
		    属性读取操作的捕捉器。
		set()
		    属性设置操作的捕捉器。
		deleteProperty()
		    delete 操作符的捕捉器。
		ownKeys()
		    Object.getOwnPropertyNames 方法和 Object.getOwnPropertySymbols 方法的捕捉器。
		apply()
		    函数调用操作的捕捉器。
		construct()
		    new 操作符的捕捉器。 

Reflect:
	返回对应操作的结果
	(1)将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到 Reflect 对象上
	(2)修改某些Object方法的返回结果,让其变得更合理。
		比如,Object.defineProperty(obj, name, desc)在无法定义属性时,会抛出一个错误,定义成功时返回修改后的对象。
		   而Reflect.defineProperty(obj, name, desc)在定义属性成功时返回 true,失败时返回 false。
 	(3)让Object操作都变成函数行为。
 		比如name in obj 和 delete obj[name]对应:Reflect.has(obj,name)和Reflect.deleteProperty(obj,name) 让它们变成了函数行为。
 	(4)Reflect对象的方法与Proxy 对象的方法一一对应,让Proxy对象可以方便地调用对应的Reflect方法,完成默认行为,作为修改行为的基础
 	
		Reflect.apply(target, thisArg, args)
		Reflect.construct(target, args)
		Reflect.get(target, name, receiver)
		Reflect.set(target, name, value, receiver)
		Reflect.defineProperty(target, name, desc)
		Reflect.deleteProperty(target, name)
		Reflect.has(target, name)
		Reflect.ownKeys(target)
		Reflect.isExtensible(target)
		Reflect.preventExtensions(target)
		Reflect.getOwnPropertyDescriptor(target, name)
		Reflect.getPrototypeOf(target)
		Reflect.setPrototypeOf(target, prototype)

代码示例:

var loggedObj = new Proxy(obj, {
  get(target, name) {
    console.log('get', target, name);
    return Reflect.get(target, name);
  },
  deleteProperty(target, name) {
    console.log('delete' + name);
    return Reflect.deleteProperty(target, name);
  },
  has(target, name) {
    console.log('has' + name);
    return Reflect.has(target, name);
  }
});

你可能感兴趣的:(es5,es6,es7,javascript)