ES6 Reflect API的优点

时间:2016-02-08 18:21:44

标签: javascript ecmascript-6

我一直在努力升级一些代码以使用ES6语法。我有以下代码行:

delete this._foo;

我的linter提出了使用建议:

Reflect.deleteProperty(this, '_foo');

您可以找到此方法的文档here

MDN文档声明:

  

Reflect.deleteProperty方法允许您删除属性   一个东西。它返回一个布尔值,指示属性是否存在   已成功删除。它几乎与非严格相同   删除操作符。

我知道delete关键字不会返回表示成功的值,但它的详细程度要低得多。

如果我不依赖于delete的成功/失败,是否有理由支持Reflect.deletePropertydelete是非严格的是什么意思?

我觉得Reflect API的很多用例都是用于解决异常情况和/或提供更好的条件流,但代价是更冗长的语句。如果我没有遇到任何与当前用法有关的问题,我想知道使用Reflect API是否有任何好处。

1 个答案:

答案 0 :(得分:14)

Reflect API暴露了常见JavaScript习惯用语的抽象操作。 主要用于提供合理的方式来转发Proxy陷阱上的操作。所有Reflect方法都匹配具有相同名称的代理陷阱的签名,因此您可以使用new Proxy(target, Reflect)创建与target对象具有相同行为的对象 - 所有内容都将被转发,包括特殊的JavaScript怪癖

对于吸气剂和原型来说尤为重要,如third argument of many methods is "receiver"

  

如果遇到getter,则this的值为目标调用提供。

请考虑以下代码:

var target = {
    get foo() {
        return this.bar;
    },
    bar: 3
};
var handler = {
    get(target, propertyKey, receiver) {
        if (propertyKey === 'bar') return 2;

        console.log(Reflect.get(target, propertyKey, receiver)); // this in foo getter references Proxy instance; logs 2
        console.log(target[propertyKey]); // this in foo getter references "target" - logs 3
    }
};
var obj = new Proxy(target, handler);

当您编写Proxy时,您希望它完全涵盖目标对象 - 并且没有惯用的方法可以在没有Reflect的情况下执行此操作。

此外,将操作符作为函数可以方便地进行函数式编程。