ES6学习系列——Reflect

Reflect:ES6的新API, 为更好地操作对象而生

那么Reflect是如何更好地操作对象的呢?大概可以从下面几个方面说说:

  • 将Object 内部方法转移到了Reflect 对象上,而且调用这些新部署在Reflect对象上的方法,返回的结果更加人性化:Object 的某些内部方法调用出了问题会直接抛出一个错误,而Reflect 对象则会返回false;
  • 更棒的是,之前直接对Object 对象进行的操作,由命令式变成了函数行为;(name in obj 变成了 Reflect.has(obj, name)
  • 再者就是 Reflect 可以和 Proxy 配合使用(Proxy的十三个拦截方法都能在Reflect上找到对应的同名函数)。Reflect在这里的作用是:虽然Proxy修改了target的某些默认行为,但有可能没有把所有的默认行为都重写,这时候Reflect 的作用的就是将这些修改了的默认行为返回给target,这样就可以保证 target 上未修改的默认行为可以正常运作。
let test = {
    a () {
        console.log("world");
    }
};
test.a(); //world
let proxy = new Proxy(test, {
    get (test, a) {
        console.log("hello");
        return Reflect.get(test, a);
    }
});
proxy.a(); 
//hello
//world

在这个例子中,用 proxy 拦截了获取属性的操作,改写test 对象的 a 方法,但是因为 handler 中加了 return Reflect.get(test, a); ,这个test的 a 方法的默认行为:console.log("world"); 还能正常运作;
其余 12 个拦截方法,对应的 12 个Reflect 方法,使用方式和这个也差不多;

猜你喜欢

转载自blog.csdn.net/qq_39798135/article/details/82422581
今日推荐