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 相关文章推荐
jQuery实现多按钮单击变色
Nov 27 Javascript
js动态生成Html元素实现Post操作(createElement)
Sep 14 Javascript
jQuery获取及设置表单input各种类型值的方法小结
May 24 Javascript
js 轮播效果实例分享
Dec 28 Javascript
js 博客内容进度插件详解
Feb 19 Javascript
JavaScript实现分页效果
Mar 28 Javascript
原生js获取left值和top值的三种方法
Aug 02 Javascript
angular6.0开发教程之如何安装angular6.0框架
Jun 29 Javascript
JavaScript寄生组合式继承原理与用法分析
Jan 11 Javascript
mock.js实现模拟生成假数据功能示例
Jan 15 Javascript
JQueryDOM之样式操作
Mar 27 jQuery
JavaScript中的ES6 Proxy的具体使用
Jun 16 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正则表达式学习笔记
2015/11/13 PHP
PHP封装的字符串加密解密函数
2015/12/18 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
2009/06/04 Javascript
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
基于jquery的bankInput银行卡账号格式化
2012/08/22 Javascript
Node.js文件操作详解
2014/08/16 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
JS实现黑客帝国文字下落效果
2015/09/01 Javascript
点评js异步加载的4种方式
2015/12/22 Javascript
jQuery实现根据滚动条位置加载相应内容功能
2016/07/18 Javascript
Angular 应用技巧总结
2016/09/14 Javascript
Bootstrap框架安装使用详解
2017/01/21 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
bootstrap Table服务端处理分页(后台是.net)
2017/10/19 Javascript
JavaScript静态作用域和动态作用域实例详解
2019/06/17 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
对Layer弹窗使用及返回数据接收的实例详解
2019/09/26 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
2020/12/04 Vue.js
Python 处理数据的实例详解
2017/08/10 Python
Python动刷新抢12306火车票的代码(附源码)
2018/01/24 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
2018/04/19 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
python中的单引号双引号区别知识点总结
2019/06/23 Python
Python常用数据类型之间的转换总结
2019/09/06 Python
详解Python中的format格式化函数的使用方法
2019/11/20 Python
英国珠宝网站Argento: PANDORA、Olivia Burton和Nomination等
2020/05/08 全球购物
武汉某公司的C#笔试题面试题
2015/12/25 面试题
大学英语演讲稿(中英文对照)
2014/01/14 职场文书
小学生个人先进事迹材料
2014/05/08 职场文书
电子专业毕业生自荐信
2014/05/25 职场文书
2015元旦主持词开场白和结束语
2014/12/14 职场文书
MySQL触发器的使用
2021/05/24 MySQL
CSS 鼠标点击拖拽效果的实现代码
2022/12/24 HTML / CSS