本文详细介绍 JavaScript 中 hasOwnProperty() 方法的用法。该方法用于检测对象是否包含指定的自身属性,忽略原型链上的继承属性。文章涵盖语法、参数说明,并通过多个示例演示如何区分自身属性与继承属性、遍历对象属性,以及处理方法被遮蔽时的安全调用方式。
hasOwnProperty() 方法概述与语法
概述
hasOwnProperty() 是 JavaScript 对象的一个内置方法,主要用于判断指定对象是否包含某个特定的自身属性。
语法格式如下: obj.hasOwnProperty(prop)
参数说明
prop
需要检测的属性名称,通常以字符串形式传入。
描述
所有继承自 Object.prototype 的对象都会拥有 hasOwnProperty 方法。该方法的核心作用是检测对象自身是否拥有特定属性,这与 in 运算符不同,因为 in 运算符会同时检查原型链上的属性,而 hasOwnProperty 仅关注对象自身的属性,忽略从原型链继承来的属性。
hasOwnProperty() 实际应用示例
示例
例1:使用 hasOwnProperty 判断对象是否含有特定自身属性
以下代码演示了如何检测对象 o 是否包含自身属性 prop:
代码如下:
o = new Object();o.prop = 'exists';function changeO() {
o.newprop = o.prop;
delete o.prop;}o.hasOwnProperty('prop');
// 返回 true
changeO();
o.hasOwnProperty('prop');
// 返回 false例2:区分自身属性与继承属性
以下示例展示了 hasOwnProperty 方法在处理自身属性和继承属性时的不同行为:
代码如下:
o = new Object();o.prop = 'exists';o.hasOwnProperty('prop');
// 返回 true
o.hasOwnProperty('toString');
// 返回 false
o.hasOwnProperty('hasOwnProperty');
// 返回 false例3:遍历对象所有自身属性
以下示例演示了在遍历对象所有属性时,如何利用 hasOwnProperty 忽略继承属性。需要注意的是,for...in 循环默认只遍历可枚举属性,这通常符合需求。若需获取所有属性(包括不可枚举的),可直接使用 Object.getOwnPropertyNames() 方法。
代码如下:
var buz = {
fog: 'stack'};
for (var name in buz) {
if (buz.hasOwnProperty(name)) {
alert("this is fog (" + name + ") for sure. Value: " + buz[name]);
}
else {
alert(name);
// toString or something else
}}注意事项:方法被遮蔽的处理
例4:hasOwnProperty 方法可能被遮蔽的情况
如果对象自身定义了一个名为 hasOwnProperty 的属性或方法,它会遮蔽原型链上的同名方法,导致调用结果异常:
代码如下:
var foo = {
hasOwnProperty: function() {
return false;
},
bar: 'Here be dragons'};foo.hasOwnProperty('bar');
// 始终返回 false
// 若担心此类遮蔽情况,建议直接使用原型链上的原始 hasOwnProperty 方法
({}).hasOwnProperty.call(foo, 'bar');
// true
Object.prototype.hasOwnProperty.call(foo, 'bar');
// true
以上即为 JavaScript 中 hasOwnProperty() 方法的完整使用说明。