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 相关文章推荐
ASP中用Join和Array,可以加快字符连接速度的代码
Aug 22 Javascript
Google AJAX 搜索 API实现代码
Nov 17 Javascript
基于jQuery的弹出框插件
Mar 18 Javascript
DWR实现模拟Google搜索效果实现原理及代码
Jan 30 Javascript
JavaScript中的原型继承基础学习教程
May 06 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
Aug 15 Javascript
总结Javascript中的隐式类型转换
Aug 24 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
Jan 23 Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
Sep 11 Javascript
DatePickerDialog 自定义样式及使用全解
Jul 09 Javascript
jQuery高级编程之js对象、json与ajax用法实例分析
Nov 01 jQuery
js实现上下左右键盘控制div移动
Jan 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
java EJB 加密与解密原理的一个例子
2008/01/11 PHP
PHP中开启gzip压缩的2种方法
2015/01/31 PHP
PHP定时任务获取微信access_token的方法
2016/10/10 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
用JAVASCRIPT如何给<textarea></textarea>赋值
2007/04/20 Javascript
一个jquery实现的不错的多行文字图片滚动效果
2014/09/28 Javascript
JS操作HTML自定义属性的方法
2015/02/10 Javascript
JQuery实现动态添加删除评论的方法
2015/05/18 Javascript
javascript每日必学之继承
2016/02/23 Javascript
JavaScript模拟鼠标右键菜单效果
2020/12/08 Javascript
jquery UI Datepicker时间控件的使用及问题解决
2016/04/28 Javascript
Jquery实时监听input value的实例
2017/01/26 Javascript
JavaScript原生数组Array常用方法
2017/04/06 Javascript
Javascript实现倒计时时差效果
2017/05/18 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
validform表单验证的实现方法
2019/03/08 Javascript
vant实现购物车功能
2020/06/29 Javascript
python去掉字符串中重复字符的方法
2014/02/27 Python
Python的Flask框架中web表单的教程
2015/04/20 Python
python制作websocket服务器实例分享
2016/11/20 Python
让python 3支持mysqldb的解决方法
2017/02/14 Python
pyqt实现.ui文件批量转换为对应.py文件脚本
2019/06/19 Python
基于python生成英文版词云图代码实例
2020/05/16 Python
中学生个人自我评价
2014/02/06 职场文书
幼儿园小班植树节活动方案
2014/03/04 职场文书
人事任命书格式
2014/06/05 职场文书
校园主题婚礼活动策划方案
2014/09/15 职场文书
普通党员自我剖析材料
2014/10/07 职场文书
优秀团队申报材料
2014/12/26 职场文书
2015国庆节宣传语
2015/07/14 职场文书
诚实守信主题班会
2015/08/13 职场文书
合作合同协议书
2016/03/21 职场文书
vue使用watch监听属性变化
2022/04/30 Vue.js