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 三种创建对象的方法
Oct 16 Javascript
JavaScript CSS修改学习第三章 修改样式表
Feb 19 Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
Aug 30 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
Dec 11 Javascript
JavaScript修改浏览器tab标题小技巧
Jan 06 Javascript
javascript实现随机读取数组的方法
Aug 03 Javascript
微信小程序 实现拖拽事件监听实例详解
Nov 16 Javascript
Form表单上传文件(type="file")的使用
Aug 03 Javascript
详解element-ui日期时间选择器的日期格式化问题
Apr 08 Javascript
ES6 Object.assign()的用法及其使用
Jan 18 Javascript
jQuery 动画与停止动画效果实例详解
May 19 jQuery
在vue中实现给每个页面顶部设置title
Jul 29 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
CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
2020/03/17 数码科技
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
PHP中Session引起的脚本阻塞问题解决办法
2014/04/08 PHP
PHP 验证登陆类分享
2015/03/13 PHP
php中smarty区域循环的方法
2015/06/11 PHP
javascript对象的property和prototype是这样一种关系
2007/03/24 Javascript
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
2009/07/14 Javascript
用JQuery实现全选与取消的两种简单方法
2014/02/22 Javascript
JavaScript中toString()方法的使用详解
2015/06/05 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
javascript每日必学之循环
2016/02/19 Javascript
JQuery Ajax WebService传递参数的简单实例
2016/11/02 Javascript
Servlet实现文件上传,可多文件上传示例
2016/12/05 Javascript
Base64(二进制)图片编码解析及在各种浏览器的兼容性处理
2017/02/09 Javascript
微信小程序 图片加载(本地,网路)实例详解
2017/03/10 Javascript
vue-cli如何添加less 以及sass
2017/07/06 Javascript
基于AngularJS的简单使用详解
2017/09/10 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
React手稿之 React-Saga的详解
2018/11/12 Javascript
微信小程序实现form表单本地储存数据
2019/06/27 Javascript
微信小程序button标签open-type属性原理解析
2020/01/21 Javascript
[01:04:30]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python全局变量操作详解
2015/04/14 Python
详解Python odoo中嵌入html简单的分页功能
2019/05/29 Python
python3 deque 双向队列创建与使用方法分析
2020/03/24 Python
python删除指定列或多列单个或多个内容实例
2020/06/28 Python
浅谈利用缓存来优化HTML5 Canvas程序的性能
2015/05/12 HTML / CSS
Wojas罗马尼亚网站:波兰皮鞋品牌
2018/11/01 全球购物
物业管理求职自荐信
2013/09/25 职场文书
历史学专业个人的自我评价
2013/10/13 职场文书
水电站项目建议书
2014/05/12 职场文书
感恩小明星事迹材料
2014/05/23 职场文书
青年文明号申报材料
2014/12/23 职场文书
办公室管理规章制度
2015/08/04 职场文书
如何用六步教会你使用python爬虫爬取数据
2022/04/06 Python
Java版 单机五子棋
2022/05/04 Java/Android