向版主澄清,因为一些版主在浏览问题时速度有点快,我必须强调,我不是在问为什么要使用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不是它自己的原型,所以有不同的类型,但是由于您可以在任何一个对象上覆盖道具,所以这里没有太多的保护措施,IMHO。
所以,我想知道,当Object的原型实现时,Object是否有什么意义呢?
发布于 2019-10-25 08:42:03
使用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)之间的区别解释了here
https://stackoverflow.com/questions/58554462
复制相似问题