语法

obj.hasOwnProperty(prop)

参数

prop

要检测的属性的 String 字符串形式表示的名称,或者 Symbol

返回值

用来判断某个对象是否含有指定的属性的布尔值 Boolean

描述

所有继承了 Object 的对象都会继承到 hasOwnProperty 方法。这个方法可以用来检测一个对象是否含有特定的自身属性;和 in 运算符不同,该方法会忽略掉那些从原型链上继承到的属性。

备注

即使属性的值是 null 或 undefined,只要属性存在,hasOwnProperty 依旧会返回 true

o = new Object();
o.propOne = null;
o.hasOwnProperty('propOne'); // 返回 true
o.propTwo = undefined;
o.hasOwnProperty('propTwo'); // 返回 true

示例

使用 hasOwnProperty 方法判断属性是否存在

下面的例子检测了对象 o 是否含有自身属性 prop

o = new Object();
o.hasOwnProperty('prop'); // 返回 false
o.prop = 'exists';
o.hasOwnProperty('prop'); // 返回 true
delete o.prop;
o.hasOwnProperty('prop'); // 返回 false

自身属性与继承属性

下面的例子演示了 hasOwnProperty 方法对待自身属性和继承属性的区别:

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

遍历一个对象的所有自身属性

下面的例子演示了如何在遍历一个对象的所有属性时忽略掉继承属性,注意这里 for...in  循环只会遍历可枚举属性,所以不应该基于这个循环中没有不可枚举的属性而得出 hasOwnProperty 是严格限制于可枚举项目的(如同 Object.getOwnPropertyNames())。

var buz = {fog: 'stack'
};for (var name in buz) {if (buz.hasOwnProperty(name)) {console.log('this is fog (' +name + ') for sure. Value: ' + buz[name]);}else {console.log(name); // toString or something else}
}

使用 hasOwnProperty 作为属性名

JavaScript 并没有保护 hasOwnProperty 这个属性名,因此,当某个对象可能自有一个占用该属性名的属性时,就需要使用外部的 hasOwnProperty 获得正确的结果:

var foo = {hasOwnProperty: function() {return false;},bar: 'Here be dragons'
};foo.hasOwnProperty('bar'); // 始终返回 false// 如果担心这种情况,
// 可以直接使用原型链上真正的 hasOwnProperty 方法
({}).hasOwnProperty.call(foo, 'bar'); // true// 也可以使用 Object 原型上的 hasOwnProperty 属性
Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

注意,只有在最后一种情况下,才不会新建任何对象。

直接上代码来个示例:

function ObjWithProto(){this.foo = 'foo_val'
}
ObjWithProto.prototype.bar = 'bar_val'
var dict = new ObjWithProto()
dict.foobar = 'foobar_val'dict.hasOwnProperty('foo') // true
dict.hasOwnProperty('foobar') // true
dict.hasOwnProperty('bar') // false

再来看 for…in , 遍历一个对象的可枚举属性

for(let i in dict){console.log(i)
}
//foo
// foobar
// bar        //原型链上的bar也获取到了

为了遍历一个对象的所有属性时忽略掉继承属性,使用hasOwnProperty()来过滤该对象上的继承属性。

for(let i in dict){if(dict.hasOwnProperty(i)){console.log(i)}
}
//foo
//foobar

再来看看原型连上的一个继承

    function ObjWithProto(){this.foo = 'foo_val'}ObjWithProto.prototype.bar = 'bar_val'function Person(){this.name = 'Person_name'}Person.prototype = new ObjWithProto()var _child = new Person()for(let i in _child){console.log(i)}console.log('------ this is a line -------')for(let i in _child){if(_child.hasOwnProperty(i)){console.log(i)}}_child.hasOwnProperty('name') // true_child.hasOwnProperty('foo') // false_child.hasOwnProperty('bar') // false//name//foo//bar//------ this is a line -------//name

用for...in循环会获取到原型链上的可枚举属性,不过可以使用hasOwnProperty()方法过滤掉。

JavaScript 中 obj.hasOwnProperty(prop) 方法相关推荐

  1. 区分JavaScript中slice与splice方法

    区分JavaScript中slice与splice方法 slice()方法是从已有的数组中返回通过索引选定的元素. 语法:array.slice(startIndex,endIndex) 参数star ...

  2. 5种JavaScript中常用的排序方法

    5种JavaScript中常用的排序方法 01.冒泡排序 通过相邻数据元素的交换,逐步将待排序序列变为有序序列,如果前面的数据大于后面的数据,就将两值进行交换,将数据进行从小到大的排序,这样对数组的第 ...

  3. php中this的使用技巧,JavaScript中this关键字使用方法详解

    JavaScript中this关键字使用方法详解 在面向对象编程语言中,对于this关键字我们是非常熟悉的.比如C++.C#和Java等都提供了这个关键字,虽然在开始学习的时候觉得比较难,但只要理解了 ...

  4. JavaScript中遍历数组的方法

    目录 JavaScript中遍历数组的方法 1.for 循环遍历 2.forEach 遍历 3.map 遍历 4.for...of 遍历 5.filter 遍历 6.some 遍历 7.keys,va ...

  5. html script 换行,JavaScript中实现换行的方法

    JavaScript中实现换行的方法 发布时间:2021-03-15 10:55:53 来源:亿速云 阅读:122 作者:小新 小编给大家分享一下JavaScript中实现换行的方法,希望大家阅读完这 ...

  6. javascript中对象的assign()方法

    javascript中对象的assign()方法 Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象. 语法: Object.assign( ...

  7. JavaScript中Object.prototype.toString方法的原理

    在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. <一>, ECMAScript 3  1. 在E ...

  8. JavaScript中this关键字使用方法详解

    在面向对象编程语言中,对于this关键字我们是非常熟悉的.比如C++.C#和Java等都提供了这个关键字,虽然在开始学习的时候觉得比较难,但只要理解了,用起来是非常方便和意义确定的.JavaScrip ...

  9. jQuery中attr和prop方法的区别

    2019独角兽企业重金招聘Python工程师标准>>> 相比attr,prop是1.6.1才新出来的,两者从中文意思理解,都是获取/设置属性的方法(attributes和proper ...

最新文章

  1. Linux系统安装gcc/g++详细过程
  2. Oracle中实现continue的方法
  3. vs2008C1902程序数据库管理不匹配
  4. webpack-安装
  5. 有时间依存效应或时间依存风险因素的生存分析
  6. STM32入门(一)Keil5软件安装以及使用
  7. 数据库开发常见面试题
  8. 知识图谱构建(概念,工具,实例调研)
  9. ZigBee-CC2530单片机 - 按键控制LED
  10. 计算机文件夹中看不到桌面图标,电脑文件夹内不显示图标
  11. 固定不动的层(兼容IE6)
  12. java 分页导出word_Java导出Word问题
  13. unity 打开项目路径无效_怎么打开已有的unity工程文件?如何打开一个已有的unity3d游戏工程啊?...
  14. Mini CFA 考试练习题 Microeconomics
  15. 【U8+】用友U8数据卸出提示“更改卸载业务单据关闭日期删除后处理出错,错误描述,存储过程没有任何参数”
  16. Git用户手册--GitHub
  17. HP笔记本功能键(f1-f12)与fn键的使用
  18. [web效果实现-3] 拼音排序通讯录实现
  19. FPGA并行计算可编程芯片
  20. 银河麒麟怎么卸载软件_常见问题·银河麒麟操作系统 麒麟操作系统 中标麒麟 麒麟软件官方网站...

热门文章

  1. 信息奥赛一本通1486: CH 6202 黑暗城堡 最短路径生成树计数
  2. poj1251 Jungle Roads Kruskal算法+并查集
  3. 汽车行业中的AUTOSAR与OSEK到底是什么,有什么区别
  4. Eigen入门之密集矩阵 8 - resharp slicing切片
  5. Java字符串编码和转换操作
  6. MOSSE目标跟踪算法的理解
  7. 【Attention】Visual Attention Network
  8. 服务器端 python pdb 调试
  9. python3(十一)内置模块和类型转换
  10. python 降噪_使用降噪自动编码器重建损坏的数据(Python代码)