Javascript学习笔记之 对象篇(三) : hasOwnProperty
//PoisoningObject.prototype Object.prototype.bar=1; varfoo={goo:undefined}; foo.bar;//1 'bar'infoo;//true foo.hasOwnProperty('bar');//false foo.hasOwnProperty('goo');//true
在这里,只有hasOwnProperty能给出正确答案,这在遍历一个对象的属性时是非常必要的。Javascript中没有其他方法能判断一个属性是定义在对象本身还是继承自原型链。
hasOwnProperty作为属性
Javascript并未将hasOwnProperty设为敏感词,这意味着你可以拥有一个命名为hasOwnProperty的属性。这个时候你无法再使用本身的hasOwnProperty方法来判断属性,所以你需要使用外部的hasOwnProperty方法来进行判断。
varfoo={ hasOwnProperty:function(){ returnfalse; }, bar:'Herebedragons' }; foo.hasOwnProperty('bar');//alwaysreturnsfalse //UseanotherObject'shasOwnPropertyandcallitwith'this'settofoo ({}).hasOwnProperty.call(foo,'bar');//true //It'salsopossibletousehasOwnPropertyfromtheObject //prototypeforthispurpose Object.prototype.hasOwnProperty.call(foo,'bar');//true
总结
当判断对象属性存在时,hasOwnProperty是唯一可以依赖的方法。这里还要提醒下,当我们使用forinloop来遍历对象时,使用hasOwnProperty将会很好地避免来自原型对象扩展所带来的困扰。
下面是其他网友的补充:
Javascript中Object对象原型上的hasOwnProperty()用来判断一个属性是定义在对象本身而不是继承自原型链。
obj.hasOwnProperty(prop)
参数prop
要检测的属性字符串名称或者Symbol(ES6)
o=newObject(); o.prop='exists'; o.hasOwnProperty('prop');//返回true o.hasOwnProperty('toString');//返回false o.hasOwnProperty('hasOwnProperty');//返回false
使用hasOwnProperty作为某个对象的属性名
因为javascript没有将hasOwnProperty作为一个敏感词,所以我们很有可能将对象的一个属性命名为hasOwnProperty,这样一来就无法再使用对象原型的hasOwnProperty方法来判断属性是否是来自原型链。
varfoo={ hasOwnProperty:function(){ returnfalse; }, bar:'Herebedragons' }; 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