Object.hasOwnProperty 与 Object.prototype.hasOwn

澄清主持人 由于一些版主扫描方面的问题时,whee位快,我必须强调,我不问为什么要使用Object.prototype.hasOwnProperty.call替代myObject.hasOwnProperty。细节决定成败。


该ESLint规则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);。


相反obj.hasOwnProperty(field),您应该使用Object.prototype.hasOwnProperty.call(obj, field). 我真的没有看到 this 和 之间的区别Object.hasOwnProperty.call(obj, field)。当然,Object它不是它自己的原型,因此存在各种差异,但是由于您可以覆盖任一对象上的道具,因此这里并没有太多的保护措施,恕我直言。


所以我想知道什么Object时候Object会做原型有什么意义吗?


守着星空守着你
浏览 430回答 1
1回答

LEATH

使用Object.hasOwnProperty很奇怪,因为它使您看起来像是在使用静态方法,例如Object.assign().它仍然有效,因为如果在 上找不到属性Object,它会回退到Function.prototype对象。而且,这个对象继承自Object.prototype. 因此,如果您有自定义实现Function.prototype.hasOwnProperty,Object.hasOwnProperty则将使用该实现而不是Object.prototype.hasOwnPropertyconsole.log( Object.hasOwnProperty === Object.prototype.hasOwnProperty ) // trueconsole.log( Object.getPrototypeOf(Object) === Function.prototype ) // trueconsole.log( Object.getPrototypeOf(Function.prototype) === Object.prototype ) // trueFunction.prototype.hasOwnProperty = _ => 'custom implementaion in Function.prototype'const obj = { prop: 10 }console.log(Object.hasOwnProperty.call(obj, 'prop')) // custom implementaionconsole.log(Object.prototype.hasOwnProperty.call(obj, 'prop')) // true注意:Object.prototype.hasOwnProperty.call(myObj, prop)和之间的区别在这里myObj.hasOwnProperty(prop)解释
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript