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 字符 Escape,encodeURI,encodeURIComponent
Jul 09 Javascript
JavaScript 内置对象属性及方法集合
Jul 04 Javascript
jquery实现触发时更新下拉列表内容的方法
Dec 02 Javascript
利用angularjs1.4制作的简易滑动门效果
Feb 28 Javascript
vue v-model表单控件绑定详解
May 17 Javascript
详解AngularJS用Interceptors来统一处理HTTP请求和响应
Jun 08 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
Jan 09 jQuery
React中如何引入Angular组件详解
Aug 09 Javascript
浅谈JS的原型和继承
May 08 Javascript
详解js实时获取并显示当前时间的方法
May 10 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
Jun 18 jQuery
vue 实现LED数字时钟效果(开箱即用)
Dec 08 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中文本数据翻页(留言本翻页)
2006/10/09 PHP
服务器上配置PHP运行环境教程
2015/02/12 PHP
使用URL传输SESSION信息
2015/07/14 PHP
php实现贪吃蛇小游戏
2016/07/26 PHP
window.location和document.location的区别分析
2008/12/23 Javascript
JavaScript 常见对象类创建代码与优缺点分析
2009/12/07 Javascript
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
JS验证身份证有效性示例
2013/10/11 Javascript
在firefox和Chrome下关闭浏览器窗口无效的解决方法
2014/01/16 Javascript
分享10个原生JavaScript技巧
2015/04/20 Javascript
jQuery中get方法用法分析
2016/12/07 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
2017/02/27 Javascript
jQuery插件zTree实现的基本树与节点获取操作示例
2017/03/08 Javascript
AngularJS $http模块POST请求实现
2017/04/08 Javascript
jquery应用实例分享_实现手风琴特效
2018/02/01 jQuery
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
Vue+webpack+Element 兼容问题总结(小结)
2018/08/16 Javascript
Vue.js 使用v-cloak后仍显示变量的解决方法
2018/11/19 Javascript
微信小程序实现swiper切换卡内嵌滚动条不显示的方法示例
2018/12/20 Javascript
axios实现简单文件上传功能
2019/09/25 Javascript
vue实现百度语音合成的实例讲解
2019/10/14 Javascript
python 批量添加的button 使用同一点击事件的方法
2019/07/17 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
2020/01/09 Python
python给图像加上mask,并提取mask区域实例
2020/01/19 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
2020/02/29 Python
利用matplotlib为图片上添加触发事件进行交互
2020/04/23 Python
基于python实现删除指定文件类型
2020/07/21 Python
最简单的matplotlib安装教程(小白)
2020/07/28 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
英国时尚女装购物网站:Missguided
2018/08/23 全球购物
社团招新策划书
2014/02/04 职场文书
办公室副主任职责范本
2014/03/08 职场文书
建筑安全员岗位职责
2014/03/13 职场文书
工作说明书范文
2014/05/07 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书