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 相关文章推荐
有关DOM元素与事件的3个谜题
Nov 11 Javascript
Chrome Form多次提交表单问题的解决方法
May 09 Javascript
jquery利用event.which方法获取键盘输入值的代码
Oct 09 Javascript
node.js回调函数之阻塞调用与非阻塞调用
Nov 13 Javascript
微信小程序 Audio API详解及实例代码
Sep 30 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
Nov 24 Javascript
vue实现app页面切换动画效果实例
May 23 Javascript
ejsExcel模板在Vue.js项目中的实际运用
Jan 27 Javascript
swiper 解决动态加载数据滑动失效的问题
Feb 26 Javascript
js实现按钮开关单机下拉菜单效果
Nov 22 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
Jun 13 Javascript
javascript 代码是如何被压缩的示例代码
May 06 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
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
php面向对象中static静态属性与方法的内存位置分析
2015/02/08 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
PHP关键特性之命名空间实例详解
2017/05/06 PHP
DEFER怎么用?
2006/07/01 Javascript
jquery 上下滚动广告
2009/06/17 Javascript
JS实现样式清新的横排下拉菜单效果
2015/10/09 Javascript
第三章之Bootstrap 表格与按钮功能
2016/04/25 Javascript
checkbox批量选中,获取选中项的值的简单实例
2016/06/28 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
2017/01/26 Javascript
react实现pure render时bind(this)隐患需注意!
2017/03/09 Javascript
webpack实现热加载自动刷新的方法
2017/07/30 Javascript
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
解析Vue.js中的组件
2018/02/02 Javascript
JavaScript+H5实现微信摇一摇功能
2018/05/23 Javascript
Node批量爬取头条视频并保存方法
2018/09/20 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
2018/09/26 Javascript
JS操作json对象key、value的常用方法分析
2019/10/29 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
wxPython的安装图文教程(Windows)
2017/12/28 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
2018/01/24 Python
详解Python3除法之真除法、截断除法和下取整对比
2019/05/23 Python
Python实现AI自动抠图实例解析
2020/03/05 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
HTML5的自定义属性data-*详细介绍和JS操作实例
2014/04/10 HTML / CSS
意大利网上购书网站:Libraccio.it
2021/02/03 全球购物
会计电算化个人自我评价
2013/11/17 职场文书
学校消防演习方案
2014/02/19 职场文书
大学信息公开实施方案
2014/03/09 职场文书
小学综治宣传月活动总结
2014/07/02 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
2015年入党积极分子评语
2015/03/26 职场文书
教师个人师德工作总结2015
2015/05/12 职场文书
小学班主任教育随笔
2015/08/15 职场文书
如何用JS实现简单的数据监听
2021/05/06 Javascript
Springboot中如何自动转JSON输出
2022/06/16 Java/Android