ECMAScript 6 Reflect

Reflect是一个内置的对象,提供拦截 JavaScript 操作的方法。这些方法与**处理器对象(handler)**的方法相同。

Reflect不是一个函数对象,不可对其使用new操作符

ES6 推出Reflect的主要目的是,将一些明显属于语言范畴的方法,转移到Reflect对象上,例如:Object.definePropertyFunction.prototype.apply(),未来类似的功能也将只在Reflect对象上实现。其次,Reflect的方法返回值是一个布尔值,对于对象的操作更加合理,不需要使用try...catch进行捕获。此外,是某些命令式的操作,转为函数式的行为,比如:delete obj[prop]使用Reflect.deleteProperty(obj, prop)替代。

由于总能在Reflect对象上找到Proxy支持的拦截方法,Proxy可以通过调用Reflect对应的方法作为修改行为的基础,ProxyReflect的结合使得对对象的操作更加的便捷。

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)

修改对象的原型

最后更新于