我一直在努力升级一些代码以使用ES6语法。我有以下代码行:
delete this._foo;
我的linter提出了使用建议:
Reflect.deleteProperty(this, '_foo');
您可以找到此方法的文档here。
MDN文档声明:
Reflect.deleteProperty方法允许您删除属性 一个东西。它返回一个布尔值,指示属性是否存在 已成功删除。它几乎与非严格相同 删除操作符。
我知道delete
关键字不会返回表示成功的值,但它的详细程度要低得多。
如果我不依赖于delete
的成功/失败,是否有理由支持Reflect.deleteProperty
? delete
是非严格的是什么意思?
我觉得Reflect
API的很多用例都是用于解决异常情况和/或提供更好的条件流,但代价是更冗长的语句。如果我没有遇到任何与当前用法有关的问题,我想知道使用Reflect
API是否有任何好处。
答案 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
的情况下执行此操作。
此外,将操作符作为函数可以方便地进行函数式编程。