[Javascript] hasOwnProperty

Dev_sheep·2024년 8월 10일
0

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 가 나온다

그래서 어떤 경우에 사용하나?

  1. 객체의 직접 속성 확인을 위해
    • 상속된 속성과 혼동을 피하기 위해 직접 정의한 것과 구분하기 위해 사용한다
  2. 안전한 객체 프로퍼티 접근
    • 객체 속성 순회 시 상속된 속성을 필터링하여 안전하게 접근한다
    • 예시를 보자
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를 적용하면 될 것 같다

추가 적인 다른 예시

  • 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 은 위의 예시로 볼 때 customObjthis로 하여 실행되도록 강제할 수 있다.
    즉, customObj의 속성 중에 name이 있는지, hasOwnProperty가 있는지 객체 그 자체 내에서 프로토타입 체이닝을 가지 않도록 판단하게 해준다
  • 객체의 중첩된 속성 확인
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
profile
기록과 공유

0개의 댓글