hasOwnProperty是JS中Object原型上的一个方法,用于检查对象自身是否具有指定的属性,这里的属性不包括对象原型链上继承的属性。
const person = {
name: '张三',
age: 25
};
console.log(person.hasOwnProperty('name')); // true
console.log(person.hasOwnProperty('age')); // true
console.log(person.hasOwnProperty('toString')); // false(继承自Object原型)
与原型链属性的区别
function Car(brand) {
this.brand = brand;
}
Car.prototype.start = function() {
console.log('启动');
};
const myCar = new Car('Toyota');
console.log(myCar.hasOwnProperty('brand')); // true(实例自身属性)
console.log(myCar.hasOwnProperty('start')); // false(原型链上的方法)
与in的区别,in可以判断某属性是否存在于原型链上
const obj = { a: 1 };
console.log(obj.hasOwnProperty('a')); // true
console.log('a' in obj); // true
console.log(obj.hasOwnProperty('toString')); // false
console.log('toString' in obj); // true
所以,在常见的业务中,时常会遇到判断某个对象中是否存在某个属性,这个时候应该怎么判断呢 ?
在这里,直接使用obj.a来判断,是有风险的,存在被重写的可能。
const obj = { a: 1 };
// 不安全的方式(可能被重写)
if (obj.a) { /* ... */ }
// 安全的方式
if (obj.hasOwnProperty('a')) { /* ... */ }
覆盖的问题
const obj = { hasOwnProperty: '我被覆盖了' };
// 这样调用会出错
// obj.hasOwnProperty('a'); // TypeError: obj.hasOwnProperty is not a function
// 安全调用方式
Object.prototype.hasOwnProperty.call(obj, 'a');