reflect存在的意义:
1,将object对象一些内部的方法,放到Reflect对象上。比如:object.defineProperty
说明:现阶段这些方法存在于object和Reflect对象上,未来只存在于Reflect对象上。
意义:也就是说,从Reflect对象上可以拿到语言内部的方法。
2,操作对象时出现报错返回false
说明:比如,Object.defineProperty(obj, name, desc)在无法定义属性时,会抛出一个错误,而Reflect.defineProperty(obj, name, desc)则会返回false。
// 老写法
try {
Object.defineProperty(target, property, attributes);
// success
} catch (e) {
// failure
}
// 新写法
if (Reflect.defineProperty(target, property, attributes)) {
// success
} else {
// failure
}
3,让操作对象的编程变为函数式编程
说明:老写法有的是命令式编程,比如下面这个例子
// 老写法
'assign' in Object // true
// 新写法
Reflect.has(Object, 'assign') // true
4,保持和proxy对象的方法一一对应
说明:Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。
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;
}
});
总结:综上所述,Reflect对象有4个意义:
从Reflect对象上可以拿到语言内部的方法。
操作对象出现报错时返回false
让操作对象都变为函数式编程
保持和proxy对象的方法一一对象
Reflect常用api:
静态方法:
Reflect对象一共有 13 个静态方法。
以上方法具体实现请自行google
实例:观察者实例实现:
const queuedObservers = new Set();
const observe = fn => queuedObservers.add(fn);
const observable = obj => new Proxy(obj, {set});
function set(target, key, value, receiver) {
const result = Reflect.set(target, key, value, receiver);
queuedObservers.forEach(observer => observer());
return result;
}
©2018-2020 hongshali.com 版权所有 ICP证:闽ICP备18029655号-1