Object.hasOwnProperty.call()

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

obj.hasOwnProperty(key)
Object.prototype.hasOwnProperty.call(obj, key)
Object.hasOwnProperty.call(obj, key)
Object.prototype.hasOwnProperty===Object.hasOwnProperty // true
o = new Object();
o.prop = 'exists';
o.hasOwnProperty('prop');             // 返回 true
o.hasOwnProperty('toString');         // 返回 false
o.hasOwnProperty('hasOwnProperty');   // 返回 false

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

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

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

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

总的来说,使用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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。