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 相关文章推荐
懒就要懒到底——鼠标自动点击(含时间判断)
Feb 20 Javascript
鼠标移到导航当前位置的LI变色处于选中状态
Aug 23 Javascript
中止javascript执行的方法
Feb 14 Javascript
JQuery中使文本框获得焦点的方法实例分析
Feb 28 Javascript
JQuery给select添加/删除节点的实现代码
Apr 26 Javascript
js图片上传前预览功能(兼容所有浏览器)
Aug 24 Javascript
基于Vue2的移动端开发环境搭建详解
Nov 03 Javascript
解决vue多个路由共用一个页面的问题
Mar 12 Javascript
推荐15个最好用的JavaScript代码压缩工具
Feb 13 Javascript
小程序获取当前位置加搜索附近热门小区及商区的方法
Apr 08 Javascript
js实现移动端吸顶效果
Jan 08 Javascript
怎么理解wx.navigateTo的events参数使用详情
May 18 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面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
2009/09/30 PHP
php pki加密技术(openssl)详解
2013/07/01 PHP
php命令行使用方法和命令行参数说明
2014/04/08 PHP
如何让CI框架支持service层
2014/10/29 PHP
初识Laravel
2014/10/30 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
2010/11/28 Javascript
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
Jquery实现三层遍历删除功能代码
2013/04/23 Javascript
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
jQuery中的val()示例应用
2014/02/26 Javascript
直接拿来用的页面跳转进度条JS实现
2016/01/06 Javascript
JS框架之vue.js(深入三:组件1)
2016/09/29 Javascript
JavaScript实现反转字符串的方法详解
2017/04/27 Javascript
js匿名函数使用&传参(实例)
2017/09/08 Javascript
微信小程序的日期选择器的实例详解
2017/09/29 Javascript
Vue.js实现的表格增加删除demo示例
2018/05/22 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
2020/09/04 Javascript
[01:15:12]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#4Newbee VS CDEC
2016/03/03 DOTA
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
用Python脚本生成Android SALT扰码的方法
2013/09/18 Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
python实现逆波兰计算表达式实例详解
2015/05/06 Python
Python探索之爬取电商售卖信息代码示例
2017/10/27 Python
python实现年会抽奖程序
2019/01/22 Python
Django用内置方法实现简单搜索功能的方法
2020/12/18 Python
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
Hotels.com日本:国外和海外住宿,酒店预订
2019/12/13 全球购物
简历的自荐信
2013/12/19 职场文书
会计专业自我鉴定
2014/02/10 职场文书
妇女干部培训方案
2014/05/12 职场文书
老人院义工活动感想
2015/08/07 职场文书
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL