Proxy 对象用于定义基本操作的自定义行为(如属性查找、赋值、枚举、函数调用等)。代理可以拦截 js 引擎内部目标的底层对象操作,这些底层操作被拦截后会触发相应特定操作的陷阱函数。调用 **new proxy() **可创建代替其他目标(target)对象的代理,它虚拟化了目标,所以二者看起来功能一致。
Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与proxy handlers的方法相同。Reflect
不是一个函数对象,因此它是不可构造的。与大多数全局对象不同,Reflect
不是一个构造函数。你不能将其与一个new运算符一起使用,或者将Reflect
对象作为一个函数来调用。Reflect
的所有属性和方法都是静态的(就像Math
对象)。
创建代理
let target = {
}
let proxy = new Proxy(target, {
})
proxy.msg = 'jinxing'
console.log(proxy.msg) // jinxing
console.log(target.msg) // jinxing
//----------------------以上代码用babel编译后-----------------------
"use strict";
require("core-js/modules/es6.function.bind");
// 定义默认的get和set方法
var defaultHandler = {
get: function get(obj, propName) {
return obj[propName];
},
set: function set(obj, propName, val) {
obj[propName] = val;
}
};
// 定义Proxy类
var Proxy = function Proxy(target, handler) {
// 记录target和handler
this.target = target;
this.handler = handler;
// 如果用户没传get/set函数就用默认get/set替换
this.handler.get = this.handler.get || defaultHandler.get;
this.handler.set = this.handler.set || defaultHandler.set;
};
// Proxy类获取属性方法
Proxy.prototype