为了账号安全,请及时绑定邮箱和手机立即绑定

Object.hasOwnProperty 与 Object.prototype.hasOwn

Object.hasOwnProperty 与 Object.prototype.hasOwn

守着星空守着你 2021-12-02 20:02:02
澄清主持人 由于一些版主扫描方面的问题时,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会做原型有什么意义吗?
查看完整描述

1 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

使用Object.hasOwnProperty很奇怪,因为它使您看起来像是在使用静态方法,例如Object.assign().


它仍然有效,因为如果在 上找不到属性Object,它会回退到Function.prototype对象。而且,这个对象继承自Object.prototype. 因此,如果您有自定义实现Function.prototype.hasOwnProperty,Object.hasOwnProperty则将使用该实现而不是Object.prototype.hasOwnProperty


console.log( Object.hasOwnProperty === Object.prototype.hasOwnProperty ) // true

console.log( Object.getPrototypeOf(Object) === Function.prototype ) // true

console.log( Object.getPrototypeOf(Function.prototype) === Object.prototype ) // true


Function.prototype.hasOwnProperty = _ => 'custom implementaion in Function.prototype'


const obj = { prop: 10 }


console.log(Object.hasOwnProperty.call(obj, 'prop')) // custom implementaion

console.log(Object.prototype.hasOwnProperty.call(obj, 'prop')) // true


注意:Object.prototype.hasOwnProperty.call(myObj, prop)和之间的区别在这里myObj.hasOwnProperty(prop)解释


查看完整回答
反对 回复 2021-12-02
  • 1 回答
  • 0 关注
  • 429 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信