ES6 Reflect API的优点

Sea*_*son 7 javascript ecmascript-6

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

delete this._foo;

我的linter提出了使用建议:

Reflect.deleteProperty(this, '_foo');

您可以在此处找到此方法的文档.

MDN文档指出:

Reflect.deleteProperty方法允许您删除对象上的属性.它返回一个布尔值,指示属性是否已成功删除.它几乎与非严格删除运算符相同.

我知道delete关键字不会返回一个表示成功的值,但它的冗长要少得多.

如果我不依赖成功/失败delete是否有任何理由支持Reflect.deleteProperty?这delete是非严格意味着什么?

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

Gin*_*den 17

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

这对于吸气剂和原型来说尤其重要,因为许多方法的第三个参数是"接收器"

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

考虑以下代码:

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);
Run Code Online (Sandbox Code Playgroud)

当你写作时Proxy,你希望它完全覆盖目标对象 - 没有惯用的方法来做到这一点Reflect.

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