Javascript学习笔记之 对象篇(三) : hasOwnProperty


Posted in Javascript onJune 24, 2014
// Poisoning Object.prototype
Object.prototype.bar = 1;
var foo = {goo: undefined};

foo.bar; // 1
'bar' in foo; // true

foo.hasOwnProperty('bar'); // false
foo.hasOwnProperty('goo'); // true

在这里,只有 hasOwnProperty 能给出正确答案,这在遍历一个对象的属性时是非常必要的。Javascript 中没有其他方法能判断一个属性是定义在对象本身还是继承自原型链。

hasOwnProperty 作为属性

Javascript 并未将 hasOwnProperty 设为敏感词,这意味着你可以拥有一个命名为 hasOwnProperty 的属性。这个时候你无法再使用本身的 hasOwnProperty 方法来判断属性,所以你需要使用外部的 hasOwnProperty 方法来进行判断。

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

foo.hasOwnProperty('bar'); // always returns false

// Use another Object's hasOwnProperty and call it with 'this' set to foo
({}).hasOwnProperty.call(foo, 'bar'); // true

// It's also possible to use hasOwnProperty from the Object
// prototype for this purpose
Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

总结

当判断对象属性存在时,hasOwnProperty 是唯一可以依赖的方法。这里还要提醒下,当我们使用 for in loop 来遍历对象时,使用 hasOwnProperty 将会很好地避免来自原型对象扩展所带来的困扰。

下面是其他网友的补充:

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

obj.hasOwnProperty(prop)

参数 prop

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

o = new Object();
o.prop = 'exists';
o.hasOwnProperty('prop');       // 返回 true
o.hasOwnProperty('toString');     // 返回 false
o.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

参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

Javascript 相关文章推荐
JavaScript语言中的Literal Syntax特性分析
Mar 08 Javascript
js+div实现图片滚动效果代码
Feb 10 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
Jul 01 Javascript
javascript中for/in循环及使用技巧
Sep 01 Javascript
谈一谈javascript闭包
Jan 28 Javascript
JS 终止执行的实现方法
Nov 24 Javascript
select下拉框插件jquery.editable-select详解
Jan 22 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
Mar 15 Javascript
React学习笔记之高阶组件应用
Jun 02 Javascript
微信小程序 JS动态修改样式的实现方法
Dec 16 Javascript
微信小程序swiper禁止用户手动滑动代码实例
Aug 23 Javascript
如何基于filter实现网站整体变灰功能
Apr 17 Javascript
js实现div闪烁原理及实现代码
Jun 24 #Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
Jun 24 #Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
Jun 24 #Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
Jun 23 #Javascript
jquery 为a标签绑定click事件示例代码
Jun 23 #Javascript
a标签click和href执行顺序探讨
Jun 23 #Javascript
jquery trigger伪造a标签的click事件取代window.open方法
Jun 23 #Javascript
You might like
php计算两个整数的最大公约数常用算法小结
2015/03/05 PHP
PHP简单获取视频预览图的方法
2015/03/12 PHP
php实现SAE上使用storage上传与下载文件的方法
2015/06/29 PHP
vmware linux系统安装最新的php7图解
2019/04/14 PHP
asp.net和php的区别点总结
2019/10/10 PHP
jQuery 获取对象 定位子对象
2010/05/31 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
jQuery使用之标记元素属性用法实例
2015/01/19 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
AngularJS 过滤器的简单实例
2016/07/27 Javascript
利用JS做网页特效_大图轮播(实例讲解)
2017/08/09 Javascript
React教程之Props验证的具体用法(Props Validation)
2017/09/04 Javascript
详解如何在Vue项目中导出Excel
2019/04/19 Javascript
优化Vue项目编译文件大小的方法步骤
2019/05/27 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
2014/05/06 Python
在Python的gevent框架下执行异步的Solr查询的教程
2015/04/16 Python
python快速建立超简单的web服务器的实现方法
2018/02/17 Python
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
2018/12/05 Python
详解Python进阶之切片的误区与高级用法
2018/12/24 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
利用OpenCV和Python实现查找图片差异
2019/12/19 Python
印度最大的酒店品牌网络:OYO Rooms
2016/07/24 全球购物
Marc O’Polo俄罗斯官方在线商店:德国高端时尚品牌
2019/12/26 全球购物
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
临床医学大学生求职信
2013/09/28 职场文书
会计电算化毕业生自荐信
2014/03/03 职场文书
导游词开场白
2015/01/31 职场文书
2015年服务员个人工作总结
2015/05/27 职场文书
教师节座谈会主持词
2015/07/03 职场文书
计算机实训心得体会
2016/01/14 职场文书
导游词之韩国济州岛
2019/10/28 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang
python自动化测试之Selenium详解
2022/03/13 Python