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 相关文章推荐
jQuery源码分析之Event事件分析
Jun 07 Javascript
jQuery getJSON 处理json数据的代码
Jul 26 Javascript
jquery+css+ul模拟列表菜单具体实现思路
Apr 15 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
Dec 02 Javascript
javascript常用正则表达式汇总
Jul 31 Javascript
ClearTimeout消除闪动实例代码
Feb 29 Javascript
JS模拟简易滚动条效果代码(附demo源码)
Apr 05 Javascript
jQuery 移动端拖拽(模块化开发,触摸事件,webpack)
Oct 28 Javascript
Vue中"This dependency was not found"问题的解决方法
Jun 19 Javascript
Vue中axios拦截器如何单独配置token
Dec 27 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
Jan 21 Javascript
Node.js实现断点续传
Jun 23 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
杏林同学录(六)
2006/10/09 PHP
thinkphp3查询mssql数据库乱码解决方法分享
2014/02/11 PHP
php计算两个文件相对路径的方法
2015/03/14 PHP
6个超实用的PHP代码片段
2015/08/10 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
2016/07/25 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
原生javascript实现拖动元素示例代码
2014/09/01 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
vue+vuex+axios实现登录、注册页权限拦截
2018/03/09 Javascript
element-ui 设置菜单栏展开的方法
2018/08/22 Javascript
vue图片上传组件使用详解
2019/12/23 Javascript
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
2014/06/10 Python
Python实现把数字转换成中文
2015/06/29 Python
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
Python 如何访问外围作用域中的变量
2016/09/11 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
python求最大连续子数组的和
2018/07/07 Python
深入浅析Python中的迭代器
2019/06/04 Python
python常用运维脚本实例小结
2020/02/14 Python
windows10环境下用anaconda和VScode配置的图文教程
2020/03/30 Python
如何利用Python动态模拟太阳系运转
2020/09/04 Python
如何用Django处理gzip数据流
2021/01/29 Python
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
说出数据连接池的工作机制是什么?
2013/04/19 面试题
一套英文Java笔试题面试题
2016/04/21 面试题
英文自荐信
2013/12/15 职场文书
三严三实对照检查材料思想汇报
2014/09/28 职场文书
2016年会开场白台词
2015/06/01 职场文书
机器人瓦力观后感
2015/06/12 职场文书
教师节大会主持词
2015/07/06 职场文书
python爬虫selenium模块详解
2021/03/30 Python
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
Python 流媒体播放器的实现(基于VLC)
2021/04/28 Python
mysql查询结果实现多列拼接查询
2022/04/03 MySQL