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效率调优经验
Jun 04 Javascript
编写可维护面向对象的JavaScript代码[翻译]
Feb 12 Javascript
手机号码,密码正则验证
Sep 04 Javascript
JS实现模拟风力的雪花飘落效果
May 13 Javascript
JS出现失效的情况总结
Jan 20 Javascript
React Native开发封装Toast与加载Loading组件示例
Sep 08 Javascript
vue.js自定义组件directives的实例代码
Nov 09 Javascript
微信小程序实现联动选择器
Feb 15 Javascript
微信小程序云开发实现数据添加、查询和分页
May 17 Javascript
countup.js实现数字动态叠加效果
Oct 17 Javascript
小程序简单两栏瀑布流效果的实现
Dec 18 Javascript
vue项目打包后请求地址错误/打包后跨域操作
Nov 04 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
在Windows版的PHP中使用ADO
2006/10/09 PHP
解析php下载远程图片函数 可伪造来路
2013/06/25 PHP
PHP连接SQLServer2005方法及代码
2013/12/26 PHP
php中cookie实现二级域名可访问操作的方法
2014/11/11 PHP
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
js图片延迟加载的实现方法及思路
2013/07/22 Javascript
jQuery表格插件datatables用法总结
2014/09/05 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
jQuery简单实现仿京东商城的左侧菜单效果代码
2015/09/09 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
jQuery实现简单滚动动画效果
2016/04/07 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
js中的DOM模拟购物车功能
2017/03/22 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
详解微信小程序文件下载--视频和图片
2019/04/24 Javascript
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
Vue form表单动态添加组件实战案例
2019/09/02 Javascript
jQuery实现的图片点击放大缩小功能案例
2020/01/02 jQuery
jQuery实现轮播图效果demo
2020/01/11 jQuery
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
python分治法求二维数组局部峰值方法
2018/04/03 Python
六行python代码的爱心曲线详解
2019/05/17 Python
python实现统计文本中单词出现的频率详解
2019/05/20 Python
Python远程方法调用实现过程解析
2020/07/28 Python
HTML5梦幻之旅——炫丽的流星雨效果实现过程
2013/08/06 HTML / CSS
贝佳斯官方网站:Borghese
2020/05/08 全球购物
香奈儿美国官网:CHANEL美国
2020/05/20 全球购物
医科学校毕业生自荐信
2013/11/09 职场文书
简历的自我评价范文
2014/02/04 职场文书
售后服务承诺书范文
2014/03/26 职场文书
乡镇个人对照检查材料
2014/08/22 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书
开学季:喜迎新生,迎新标语少不了
2019/11/07 职场文书
Html5同时支持多端sdk的小技巧
2021/11/17 HTML / CSS
Nginx限流和黑名单配置
2022/05/20 Servers