向主持人的澄清
由于某些主持人在扫描问题时会很快,我必须强调,我并不是在问为什么使用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
的原型吗?
答案 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)
之间的区别