JS中的 hasOwnProperty 和 in

81 阅读1分钟

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');