ECMAScript 6 Reflect
Reflect是一个内置的对象,提供拦截 JavaScript 操作的方法。这些方法与**处理器对象(handler)**的方法相同。
Reflect不是一个函数对象,不可对其使用new操作符
ES6 推出Reflect的主要目的是,将一些明显属于语言范畴的方法,转移到Reflect对象上,例如:Object.defineProperty、Function.prototype.apply(),未来类似的功能也将只在Reflect对象上实现。其次,Reflect的方法返回值是一个布尔值,对于对象的操作更加合理,不需要使用try...catch进行捕获。此外,是某些命令式的操作,转为函数式的行为,比如:delete obj[prop]使用Reflect.deleteProperty(obj, prop)替代。
由于总能在Reflect对象上找到Proxy支持的拦截方法,Proxy可以通过调用Reflect对应的方法作为修改行为的基础,Proxy和Reflect的结合使得对对象的操作更加的便捷。
const proxy = new Proxy({}, {
get(...args) {
const rest = Reflect.get(...args);
if (rest) {
console.log('get property success');
} else {
console.log('get property failed');
}
return rest;
}
});
Reflect.get(proxy, 'a'); // get property failed
Reflect.set(proxy, 'a', 1);
Reflect.get(proxy, 'a'); //get property success相关API
Reflect.apply(target, context, args)
对一个函数进行调用操作,同时可以传入一个数组作为调用参数.
Reflect.construct(target, args[, newTarget])
对构造函数进行new操作.
newTarget 参考
new.target
Reflect.defineProperty(target, prop, descriptor)
定义对象属性,与Object.defineProperty()类似
Reflect.deleteProperty(target, propKey)
删除目标对象的属性,delete操作符的函数级操作
Reflect.get(target, propKey[, receiver])
获取对象身上某个属性的值
Reflect.getOwnPropertyDescriptor(target, propKey)
获取对象属性描述器。
Reflect.getPrototypeOf(target)
获取对象原型
Reflect.has(target, propKey)
检查对象是否存在某个属性
Reflect.isExtensible(target)
检查对象是否可扩展
Reflect.ownKeys(target)
返回一个包含所有自身属性(不包含继承属性)的数组
Reflect.preventExtensions(target)
将对象标记为不再可扩展
Reflect.set(target, propKey, val[, receiver])
给目标对象分配属性的值
Reflect.setPrototypeOf(target, prototype)
修改对象的原型
最后更新于