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 相关文章推荐
JS在TextArea光标位置插入文字并实现移动光标到文字末尾
Jun 21 Javascript
用jquery修复在iframe下的页面锚点失效问题
Aug 22 Javascript
jQuery选择器之基本选择器与层次选择器
Mar 03 Javascript
javascript生成大小写字母
Jul 03 Javascript
js阻止浏览器默认行为的简单实例
May 15 Javascript
JQuery 封装 Ajax 常用方法(推荐)
May 21 jQuery
利用 spin.js 生成等待效果(js 等待效果)
Jun 25 Javascript
浅谈mint-ui 填坑之路
Nov 06 Javascript
详解Webpack实战之构建 Electron 应用
Dec 25 Javascript
详解使用Next.js构建服务端渲染应用
Jul 10 Javascript
微信小程序使用for循环动态渲染页面操作示例
Dec 25 Javascript
JS浮点数运算结果不精确的Bug解决
Aug 01 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排序算法之堆排序(Heap Sort)实例详解
2018/04/21 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
JQuery里选择超链接的实现代码
2011/05/22 Javascript
html+css+js实现xp window界面及有关功能
2013/03/26 Javascript
JavaScript判断浏览器类型的方法
2015/02/10 Javascript
JavaScript中的Math.atan2()方法使用详解
2015/06/15 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
js 打开新页面在屏幕中间的实现方法
2016/11/02 Javascript
简单实现IONIC购物车功能
2017/01/10 Javascript
jQuery常用选择器详解
2017/07/17 jQuery
js中let和var定义变量的区别
2018/02/08 Javascript
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
2018/04/24 Javascript
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
2020/02/06 NodeJs
vue父子组件间引用之$parent、$children
2020/05/20 Javascript
微信小程序实现登录注册功能
2020/12/29 Javascript
python从ftp下载数据保存实例
2013/11/20 Python
Python XML转Json之XML2Dict的使用方法
2019/01/15 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
python提取xml里面的链接源码详解
2019/10/15 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
2020/02/07 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
利用python绘制数据曲线图的实现
2020/04/09 Python
C语言怎样定义和声明全局变量和函数最好
2013/11/26 面试题
vue路由实现登录拦截
2021/03/24 Vue.js
自我评价范文点评
2013/12/04 职场文书
公司会计岗位职责
2014/02/13 职场文书
网络信息安全承诺书
2014/03/26 职场文书
视光学专业自荐信
2014/06/24 职场文书
2014领导干部四风问题查摆思想汇报
2014/09/13 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书
2014年银行工作总结范文
2014/11/12 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
倡议书作文
2015/01/19 职场文书
婚宴邀请函
2015/01/30 职场文书
2015新学期校长寄语(3篇)
2015/03/25 职场文书