【发布时间】:2023-04-09 15:19:01
【问题描述】:
向版主澄清
由于一些版主在扫描问题时有点快,我必须强调我不是在问为什么使用Object.prototype.hasOwnProperty.call 而不是myObject.hasOwnProperty。魔鬼在细节中。
ESLint rule no-prototype-builtins 禁止使用来自Object 原型的内置函数。它可以为您提供对抗这样的代码:
function serverMethodToParseClientInput(json){
const o = JSON.parse(json);
if (o.hasOwnProperty("foo")) {
doSomethingMeaningful();
}
}
const stringFromClient = "{\"hasOwnProperty\":1, \"reason\": \"Crash your system\"}";
serverMethodToParseClientInput(stringFromClient);
尝试在使用null 创建的对象上调用该方法,因为它们的原型也会失败,我认为这是一个更合理的防范措施。示例:const o = Object.create(null);。
您应该使用Object.prototype.hasOwnProperty.call(obj, field),而不是obj.hasOwnProperty(field)。我真的看不出这和Object.hasOwnProperty.call(obj, field) 之间的区别。诚然,Object 不是它自己的原型,因此存在某种差异,但由于您可以覆盖任一对象上的道具,因此这里并没有太多保护措施,恕我直言。
所以我想知道在Object 可行的情况下达到Object 的原型是否有任何意义?
【问题讨论】:
-
Object.hasOwnProperty真的很奇怪——你指的是Object.protoype上的hasOwnPrototype方法,它只是碰巧起作用,因为everything 继承自Object.prototype,包括构造函数。你仍然可以使用它,假设没有分配给Object.hasOwnProperty,但这很混乱 -
@adiga 这不是重复的。您的链接问题只是给出了我在问题中已有的相同答案。请重读。我不奇怪为什么要在原型上使用该方法。我想知道为什么我不能只使用
Object.hasOwnProperty。 -
使用
Object.hasOwnProperty使它看起来像assign这样的静态方法。这可能会令人困惑。它将起作用,因为Object.hasOwnProperty === Object.prototype.hasOwnProperty。它类似于使用({}).hasOwnProperty.call -
好的,这两个 cmets 对我来说都是足够的答案(请随意实际发布答案)。所以它基本上是关于编码风格的;尽量避免混淆/模棱两可的结构。
-
请注意,它会先查看
Function.prototype对象内部,然后再返回Object.prototype。如果您覆盖Function.prototype.hasOwnProperty = () => 'custom',它将采用该实现
标签: javascript