hasOwnProperty
是 JavaScript 中对象的一个内置方法,用于检查对象自身是否具有指定的属性(而不是从原型链继承的属性)。它的作用是判断某个属性是否是对象本身的属性,而不是从原型链上继承的。
语法
obj.hasOwnProperty(prop)
-
obj
:要检查的对象。 -
prop
:要检查的属性名(字符串或 Symbol)。
返回值
-
如果对象自身有该属性,返回
true
。 -
如果对象自身没有该属性(或者属性是从原型链继承的),返回
false
。
为什么需要 hasOwnProperty
?
在 JavaScript 中,对象可以通过原型链继承属性。例如:
let parent = { a: 1 };
let child = Object.create(parent); // child 继承 parent
child.b = 2;
-
child
对象自身有一个属性b
。 -
child
从parent
继承了一个属性a
。
如果我们直接遍历 child
的属性:
for (let key in child) {
console.log(key); // 输出 'b' 和 'a'
}
会发现它不仅输出了自身的属性 b
,还输出了从原型链继承的属性 a
。
如果我们只想操作对象自身的属性,而不是继承的属性,就需要使用 hasOwnProperty
来过滤。
使用 hasOwnProperty
的示例
示例 1:检查对象自身属性
let obj = { a: 1, b: 2 };
console.log(obj.hasOwnProperty('a')); // true,obj 自身有属性 'a'
console.log(obj.hasOwnProperty('b')); // true,obj 自身有属性 'b'
console.log(obj.hasOwnProperty('toString')); // false,toString 是从原型链继承的
示例 2:遍历对象自身属性
let obj = { a: 1, b: 2 };
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key); // 只输出 'a' 和 'b'
}
}
示例 3:避免原型链属性的干扰
let parent = { a: 1 };
let child = Object.create(parent);
child.b = 2;
for (let key in child) {
if (child.hasOwnProperty(key)) {
console.log(key); // 只输出 'b',因为 'a' 是从原型链继承的
}
}
注意事项
-
hasOwnProperty
不会检查原型链-
它只会检查对象自身的属性,不会检查原型链上的属性。
-
-
hasOwnProperty
可以检查 Symbol 属性-
如果属性是 Symbol 类型,也可以使用
hasOwnProperty
检查。
let sym = Symbol('key'); let obj = { [sym]: 'value' }; console.log(obj.hasOwnProperty(sym)); // true
-
-
避免覆盖
hasOwnProperty
-
如果对象自身有一个属性名为
hasOwnProperty
,可能会覆盖原型链上的hasOwnProperty
方法。
let obj = { hasOwnProperty: 'oops' }; console.log(obj.hasOwnProperty('a')); // 报错,因为 obj.hasOwnProperty 不是函数
-
解决方法:使用
Object.prototype.hasOwnProperty.call
。
console.log(Object.prototype.hasOwnProperty.call(obj, 'a')); // false
-
总结
-
hasOwnProperty
用于检查对象自身是否具有某个属性,而不是从原型链继承的属性。 -
在遍历对象属性时,常用
hasOwnProperty
来过滤掉原型链上的属性。 -
如果对象可能覆盖
hasOwnProperty
方法,可以使用Object.prototype.hasOwnProperty.call
来避免错误。
它是 JavaScript 中处理对象属性时非常重要的工具,尤其是在需要区分自身属性和继承属性的场景中。