Object.prototype.hasOwnProperty.call()

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

obj.hasOwnProperty(prop)
  • 1
  • 1

参数 prop

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

o = new Object();
o.prop = 'exists';
o.hasOwnProperty('prop');             // 返回 true
o.hasOwnProperty('toString');         // 返回 false
o.hasOwnProperty('hasOwnProperty');   // 返回 false
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

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

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

var foo = {
    hasOwnProperty: function() {
        return false;
    },
    bar: 'Here be dragons'
};

foo.hasOwnProperty('bar'); // 始终返回 false
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

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

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() vs Object.prototype.hasOwnProperty()


在我们日常开发中,对象的使用频率很高,我们计算数组的长度是非常方便的,但是如何计算对象的长度呢?
假如我们有一个图书馆的项目,项目中有一组图书和作者,像下面这样:

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. var bookAuthors = {  
  2.     "Farmer Giles of Ham""J.R.R. Tolkien",  
  3.     "Out of the Silent Planet""C.S. Lewis",  
  4.     "The Place of the Lion""Charles Williams",  
  5.     "Poetic Diction""Owen Barfield"  
  6. };  

我们分析现在的需求,我们给一个API发送数据,但是书的长度不能超过100,因此我们需要在发送数据之前计算在一个对象中总共有多少本书。那么我们总怎么做呢?我们可能会这样做:

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. function countProperties (obj) {  
  2.     var count = 0;  
  3.     for (var property in obj) {  
  4.         if (Object.prototype.hasOwnProperty.call(obj, property)) {  
  5.             count++;  
  6.         }  
  7.     }  
  8.     return count;  
  9. }  
  10.   
  11. var bookCount = countProperties(bookAuthors);  
  12.   
  13. // Outputs: 4  
  14. console.log(bookCount);  
这是可以实现的,幸运的是Javascript提供了一个更改的方法来计算对象的长度:
[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. var bookAuthors = {  
  2.     "Farmer Giles of Ham""J.R.R. Tolkien",  
  3.     "Out of the Silent Planet""C.S. Lewis",  
  4.     "The Place of the Lion""Charles Williams",  
  5.     "Poetic Diction""Owen Barfield"  
  6. };  
  7. var arr = Object.keys(bookAuthors);  
  8.   
  9. //Outputs: Array [ "Farmer Giles of Ham", "Out of the Silent Planet", "The Place of the Lion", "Poetic Diction" ]  
  10. console.log(arr);  
  11.   
  12. //Outputs: 4  
  13. console.log(arr.length);  

下面我们来对数组使用keys方法:

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. var arr = ["zuojj""benjamin""www.zuojj.com"];  
  2.   
  3. //Outputs: ["0", "1", "2"]  
  4. console.log(Object.keys(arr));  
  5.   
  6. //Outputs: 3  
  7. console.log(arr.length);  

Object.keys() 方法会返回一个由给定对象的所有可枚举自身属性的属性名组成的数组,数组中属性名的排列顺序和使用for-in循环遍历该对象时返回的顺序一致(两者的主要区别是 for-in 还会遍历出一个对象从其原型链上继承到的可枚举属性)。











  • 10
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值