[]
该实体与代理类似,也是 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