Object.hasOwnProperty与Object.prototype.hasOwnProperty的实际区别

时间:2019-10-25 07:59:03

标签: javascript

向主持人的澄清 由于某些主持人在扫描问题时会很快,我必须强调,我并不是在问为什么使用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);

您应该使用obj.hasOwnProperty(field)而不是Object.prototype.hasOwnProperty.call(obj, field)。我真的看不到它和Object.hasOwnProperty.call(obj, field)之间的区别。当然,Object不是它自己的原型,因此种类有所不同,但是由于您可以覆盖两个对象上的道具,因此恕我直言,实际上并没有太多保护措施。

因此,我想知道Object何时可以实现Object的原型吗?

1 个答案:

答案 0 :(得分:1)

使用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

注意:here

说明了Object.prototype.hasOwnProperty.call(myObj, prop)myObj.hasOwnProperty(prop)之间的区别