Object.prototype.hasOwnProperty.call()2020-12-24

JavaScript中Object对象原型上的hasOwnProperty()用来判断一个属性是定义在对象本身而不是继承自原型链。

obj.hasOwnProperty(prop)

参数 prop

要检测的属性 字符串 名称或者 Symbol(ES6)

o = new Object();o.prop = 'exists';o.hasOwnProperty('prop');             // 返回 trueo.hasOwnProperty('toString');         // 返回 falseo.hasOwnProperty('hasOwnProperty');   // 返回 false

使用hasOwnProperty作为某个对象的属性名

因为javascript没有将hasOwnProperty作为一个敏感词,所以我们很有可能将对象的一个属性命名为hasOwnProperty,这样一来就无法再使用对象原型的 hasOwnProperty 方法来判断属性是否是来自原型链。

var foo = {    hasOwnProperty: function() {        return false;    },    bar: 'Here be dragons'}; foo.hasOwnProperty('bar'); // 始终返回 false

不能使用 该对象.hasOwnProperty 这种方法,怎么来解决这个问题呢?我们需要使用原型链上真正的 hasOwnProperty 方法:

({}).hasOwnProperty.call(foo, 'bar'); // true// 或者:Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

MDN

Why use Object.prototype.hasOwnProperty.call(myObj, prop) instead of myObj.hasOwnProperty(prop)?

总的来说,使用Object.prototype.hasOwnProperty.call()有三方面的原因:

  1. If obj inherits from null not Object.prototype
  2. If hasOwnProperty has been redeclared on obj
  3. If hasOwnProperty has been redeclared in obj's prototype chain

你可能感兴趣的:(Object.prototype.hasOwnProperty.call()2020-12-24)