hasOwnProperty
는 자바스크립트 객체의 메서드이며 특정 객체가 해당 이름의 속성을 직접적으로
가지고 있는지 확인한다.
이 말은 즉, 객체의 프로토타입
에서 상속된 속성은 무시하고, 객체 자체에 존재하는 속성
만을 검사한다.
예시를 보자
const obj = {
name: 'Alice',
age: 30
};
// 직접 정의된 속성 검사
console.log(obj.hasOwnProperty('name')); // true
console.log(obj.hasOwnProperty('age')); // true
// 존재하지 않는 속성 검사
console.log(obj.hasOwnProperty('gender')); // false
// 원형에 의해 상속된 속성 검사
console.log(obj.hasOwnProperty('toString')); // false
toString()
메서드는 Object
객체의 속성인데, 모든 객체는 Object를 상속받아서 검사할 때 true일 수는 있으나 hasOwnProperty
는 객체 자체의 속성을 판단하므로 false
가 나온다
직접 속성
확인을 위해필터링
하여 안전하게 접근한다const obj = {
name: 'Alice',
age: 30
};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key, obj[key]); // name, age만 출력
}
}
(for ... in)루프일 때 이를 방지할 수 있다
Object.keys()
를 종종 쓰긴하기도 한다.Object.hasOwn()
의 경우도 사용할 수 있다적절하게 개발을 하면서 필요한 경우에 hasOwnProperty를 적용하면 될 것 같다
const customObj = {
hasOwnProperty: 'This is a string, not a function'
};
console.log(Object.prototype.hasOwnProperty.call(customObj, 'name')); // false
console.log(Object.prototype.hasOwnProperty.call(customObj, 'hasOwnProperty')); // true
Object.prototype.hasOwnProperty.call
은 위의 예시로 볼 때 customObj
를 this
로 하여 실행되도록 강제할 수 있다.const profile = {
name: 'Jane',
address: {
city: 'New York',
zipCode: '10001'
}
};
console.log(profile.hasOwnProperty('address')) // true
console.log(profile.address.hasOwnProperty('city') // true
console.log(profile.hasOwnProperty('city')) // false