Javascript ES6的好处反映了API
我一直在努力升级一些代码以使用ES6语法。我有以下代码行:Javascript ES6的好处反映了API,javascript,ecmascript-6,Javascript,Ecmascript 6,我一直在努力升级一些代码以使用ES6语法。我有以下代码行: 删除此项。\u foo 我的linter建议使用: Reflect.deleteProperty(这是“ufoo”) 您可以找到此方法的文档 MDN文档说明: Reflect.deleteProperty方法允许您删除上的属性 物体。它返回一个布尔值,指示属性 已成功删除。它几乎与非严格的 删除运算符 我知道delete关键字不会返回表示成功的值,但它的详细程度要低得多 如果我不依赖于delete的成功/失败,是否有任何理由支持Refl
删除此项。\u foo代码>
我的linter建议使用:
Reflect.deleteProperty(这是“ufoo”)代码>
您可以找到此方法的文档
MDN文档说明:
Reflect.deleteProperty方法允许您删除上的属性
物体。它返回一个布尔值,指示属性
已成功删除。它几乎与非严格的
删除运算符
我知道delete
关键字不会返回表示成功的值,但它的详细程度要低得多
如果我不依赖于delete
的成功/失败,是否有任何理由支持Reflect.deleteProperty
?delete
不严格是什么意思
我觉得Reflect
API的许多用例都是为了解决异常情况和/或提供更好的条件流,但代价是语句更加冗长。如果我目前的使用没有遇到任何问题,我想知道使用Reflect
API是否有任何好处。Reflect
API暴露了隐藏在常见JavaScript习惯用法后面的抽象操作它的主要用途是提供合理的方法来转发在代理上调用的操作
陷阱。所有Reflect
方法都匹配同名代理陷阱的签名,因此您可以使用newproxy(target,Reflect)
创建行为与target
对象相同的对象-所有内容都将被转发,包括特殊的JavaScript怪癖
这对于getter和原型尤其重要,因为
如果遇到getter,则为调用target提供的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);
当您编写代理
时,您希望它能完全覆盖目标对象——没有反射
,就没有惯用的方法来实现这一点
此外,将运算符用作函数对于函数式编程来说很方便。我想说不,使用deleteProperty()
似乎没有任何其他好处。如果您不需要知道删除是否成功,只需使用delete
就可以了。delete
如果属性是自己的不可配置属性,我猜是deleteProperty()
不会在linter建议的这种情况下抛出错误?@Bergi ESLint的prefer reflect规则:当然,这是选择性加入,不足以实现潜在用例。只是好奇我是应该尊重它还是让它安静下来。许多与对象和属性的构造有关的方法都被添加到了新的Reflect
API中。即使Reflect.deleteProperty()
不会引发错误,它也不会删除不可配置的属性。新代理(目标,Reflect)中不需要Reflect。要创建行为类似于目标对象的代理,可以传递一个空的处理程序。根据文档:“所有陷阱都是可选的。如果尚未定义陷阱,默认行为是将操作转发到目标。”