Proxy and Reflect

274 阅读1分钟

难兄与难弟

概念

参考自现代 JavaScript 教程

  • 把Proxy可以理解为一个原型,这个原型是用来包装对象的,对象自身没有额外增加别的影响,却可以通过代理来直接操作对象。
  • Reflect 是一个内建对象,可简化 Proxy 的创建。

观点(纯属个人观点,可以忽略)

  • 为何说是难兄和难弟呢?

    • 因为吧,Proxy是一个包装器,它只能算是对象的傀儡,有名无实。而Reflect呢就是来帮它哥简化创建的。看到这,是不觉得代理够惨了,不,还有更惨的地方。对于一些采用了“内部插槽”的内建对象,Proxy直呼没有人权啊(可参考图书中Proxy的局限性)。
  • 代理是名词,映射是动词

    • 把对象当成手机屏幕,代理当成手机的钢化膜。之前没有钢化膜的时候我们直接操作屏幕,有了钢化膜之后呢,我们操作钢化膜,钢化膜将我们的操作行为映射到屏幕。

demo

/**
 * 代理对象
 * @param {object} obj 目标对象
 * @param {string} property 属性
 * @param {function} callback 回调函数
 */
export const listen = (obj, callback) => new Proxy(obj, {
	get() {
		//通过映射进行操作
		return Reflect.get(...arguments);
	},
	set(target, prop, newVal, receiver) {
		if (newVal !== target[prop]) {
			const result = [prop, newVal, target[prop], target, receiver];
			callback(...result)
		};
		return Reflect.set(...arguments)
	},
})