[]
该实体与代理类似,也是 ES6 为处理对象而新增的一种机制。它的构建意图包含多个方面。

将对象的部分显著属于语言体系的方法(诸如点号操作),迁移至对象本身,当前某些方法既在对象上存在,也部署在语言核心,往后新增的方法将仅部署在对象层面,换言之,对象本身能够获取语言体系内的方法。
调整部分函数的输出,使其更为恰当。举例来说reflect是什么意思留学之路,当尝试设定某个属性却无法成功时,一个函数会触发异常,而另一个函数则会产生一个假值。

// 老写法try {Object.defineProperty(target, property, attributes);// success} catch (e) {// failure}// 新写法if (Reflect.defineProperty(target, property, attributes)) {// success} else {// failure}
让所有操作都以函数形式执行。部分操作具有指令式特征,例如name属于obj以及obj,而.has(obj, name)和.(obj, name)则将它们转化为函数调用方式。
// 老写法'assign' in Object // true// 新写法Reflect.has(Object, 'assign') // true

对象上的方法与Proxy对象的方法逐项匹配,只要Proxy对象拥有某个方法,那么在对象中也必然存在相应的方法。这种对应关系使得Proxy对象能够便捷地调用对象中的方法,以实现预设的默认操作,并为后续的行为调整提供依据。换句话说,即便Proxy对象对默认行为进行了调整,依然可以从对象中检索到原始的默认行为。
Proxy(target, {set: function(target, name, value, receiver) {var success = Reflect.set(target, name, value, receiver);if (success) {console.log('property ' + name + ' on ' + target + ' set to ' + value);}return success;}});
那个代码里的Proxy方法会阻拦对象属性值的更改动作。它借助.set技术把数值安放到对象属性之中,务必要让原本的动作得以实现,随后再附加其他作用。
下面是另一个例子。

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);}});
上述代码里,所有Proxy对象的拦截动作,比如获取、检查属性等reflect是什么意思,都通过对应的方法实现,确保原始功能不受影响。现在需要做的,是为每个操作打印一条记录信息。

有了对象以后,很多操作会更易读。
// 老写法Function.prototype.apply.call(Math.floor, undefined, [1.75]) // 1// 新写法Reflect.apply(Math.floor, undefined, [1.75]) // 1


