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 相关文章推荐
ajax java 实现自动完成功能
Dec 19 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
Mar 15 Javascript
探讨JavaScript中声明全局变量三种方式的异同
Dec 03 Javascript
jquery动态添加option示例
Dec 30 Javascript
Javascript验证用户输入URL地址是否为空及格式是否正确
Oct 09 Javascript
JavaScript运动减速效果实例分析
Aug 04 Javascript
原生JS控制多个滚动条同步跟随滚动效果
Dec 22 Javascript
微信小程序日期时间选择器使用方法
Feb 01 Javascript
微信小程序仿RadioGroup改变样式的处理方案
Jul 13 Javascript
vue父子组件通信的高级用法示例
Aug 29 Javascript
vue 开发企业微信整合案例分析
Dec 02 Javascript
vue实现前端分页完整代码
Jun 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
让你同时上传 1000 个文件 (二)
2006/10/09 PHP
php GD绘制24小时柱状图
2008/06/28 PHP
php使浏览器直接下载pdf文件的方法
2013/11/15 PHP
php文件上传类的分享
2017/07/06 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
2019/04/16 PHP
laravel5.6中的外键约束示例
2019/10/23 PHP
JavaScript脚本语言在网页中的简单应用
2007/05/13 Javascript
发布一个高效的JavaScript分析、压缩工具 JavaScript Analyser
2007/11/30 Javascript
javascript 图片裁剪技巧解读
2012/11/15 Javascript
dwz 如何去掉ajaxloading具体代码
2013/05/22 Javascript
控制页面按钮在后台执行期间不重复提交的JS方法
2013/06/24 Javascript
javascript实现div的显示和隐藏的小例子
2013/06/25 Javascript
javascript:void(0)的作用示例介绍
2013/10/28 Javascript
从零学JS之你需要了解的几本书
2014/05/19 Javascript
jquery ajax请求方式与提示用户正在处理请稍等
2014/09/01 Javascript
JavaScript动态改变div属性的实现方法
2015/07/22 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
2016/06/22 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
微信小程序点击控件修改样式实例详解
2017/07/07 Javascript
AngularJS 控制器 controller的详解
2017/10/17 Javascript
Node.js中的cluster模块深入解读
2018/06/11 Javascript
Vue 配合eiement动态路由,权限验证的方法
2018/09/26 Javascript
如何实现一个webpack模块解析器
2018/10/24 Javascript
详解JavaScript 的执行机制
2020/09/18 Javascript
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
[01:03]悬念揭晓 11月26日DOTA2完美盛典不见不散
2017/11/23 DOTA
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
解析Python中的二进制位运算符
2015/05/13 Python
python中多层嵌套列表的拆分方法
2018/07/02 Python
Django 中自定义 Admin 样式与功能的实现方法
2019/07/04 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
使用 Python 处理3万多条数据只要几秒钟
2020/01/19 Python
什么是python的必选参数
2020/06/21 Python
PyTorch-GPU加速实例
2020/06/23 Python