我一直在努力升级一些代码以使用ES6语法。我有以下代码:
delete this._foo;我的林特提出了一个建议:
Reflect.deleteProperty(this, '_foo');您可以找到此方法这里的文档。
MDN文档状态:
Reflect.deleteProperty方法允许您删除对象上的属性。它返回一个布尔值,指示该属性是否已成功删除。它几乎与非严格删除操作符相同。
我知道delete关键字不会返回一个表示成功的值,但它不那么冗长。
如果我不依赖于delete的成功/失败,有什么理由支持Reflect.deleteProperty吗?delete是不严格的是什么意思?
我觉得很多用于Reflect API的用例都是为了解决特殊情况和/或提供更好的条件流,但代价是语句要冗长得多。我想知道,如果我目前的使用没有遇到任何问题,那么使用Reflect API是否有什么好处。
发布于 2016-08-17 18:19:02
Reflect API公开了保留在常见的JavaScript习语后面的抽象操作。它的主要用途是提供合理的方法来转发调用Proxy 的操作。所有Reflect方法都匹配具有相同名称的代理陷阱的签名,因此您可以使用new Proxy(target, Reflect)创建行为与target对象相同的对象--所有内容都将被转发,包括特殊的JavaScript怪癖。
它对于getter和原型特别重要,如许多方法的第三个论点是“接收者”。
如果遇到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,就没有一种惯用的方法来做到这一点。
此外,以运算符为函数也方便了函数式编程。
https://stackoverflow.com/questions/35276559
复制相似问题