LHJ

I'm a FE developer.

10-6. Object 오브젝트(ES3 기준) / 프로퍼티 처리 메소드

30 Nov 2020 » js_beginner

10-6. Object 오브젝트(ES3 기준) / 프로퍼티 처리 메소드

hasOwnProperty()

구분데이터(값)
object기준 인스턴스
파라미터프로퍼티 이름
반환true, false

  • 인스턴스에 파라미터 이름이

    • 존재하면 true 반환
    • 존재하지 않으면 false 반환
      var obj = { value: 123 };
      var own = obj.hasOwnProperty("value");
      console.log(own); // true
    
    1. obj 인스턴스에 value 프로퍼티가 존재하며
    2. obj를 만들면서 직접 작성했으므로 true 반환
      var obj = { value: undefined };
      var own = obj.hasOwnProperty("value");
      console.log(own); // true
    
    1. undefined가 값이지만 false로 인식됩니다.
    2. 하지만, 값은 체크하고 존재여부만 체크하므로 true 반환

  • 자신이 만든 것이 아니라

    • 상속받은 프로퍼티이면 false 반환
      var obj = {};
      var own = obj.hasOwnProperty("hasOwnProperty");
      console.log(own); // false
    
    1. hasOwnProperty()는 자신이 만든 것이 아니라 빌트인 Object 오브젝트에 있는 것
    2. {}를 실행하면 빌트인 Object 오브젝트의 prototype에 연결된 메소드를 사용하여
    3. Object 인스턴스를 만드므로 자신이 만든 것이 아닙니다.

var obj = {};

빌트인 Object 오브젝트의 prototype에 있는 6개의 메소드를 활용해 인스턴스를 만듭니다.
그 6개 중 하나가 hasOwnProperty입니다.
obj.hasOwnProperty로 함수를 호출하면 당연히 존재하니까 호출됩니다.
그런데 hasOwnProperty는 내가 만든 것이 아니라 빌트인 Object 오브젝트에서 만든겁니다.

내가 만든 것은 아까 위의 코드에서 보았듯이

var obj = {value: "value"};

이렇게 작성되어야 합니다.
위와 같은 것이 내가 만든 것입니다.
그러나 hasOwnProperty는 내가 만든 것이 아니라 빌트인 Object 오브젝트가 만든 것입니다.

그래서 false가 반환됩니다.

propertyIsEnumerable()

구분데이터(값)
object인스턴스, 오브젝트
파라미터프로퍼티 이름
반환true, false

  • 오브젝트에서 프로퍼티를

    • 열거할 수 있으면 true 반환

        var obj = { sports: "축구" };
        console.log(obj.propertyIsEnumerable("sports")); // true
      
      1. { sports: “축구” } 형태로 생성한 인스턴스는
      2. obj의 프로퍼티를 열거할 수 있습니다.

      위 형태는 for in 문으로 열거할 수 있습니다.
      따라서 true가 반환됩니다.

    • 열거할 수 없으면 false 반환

        var obj = { sports: "축구" };
        Object.defineProperty(obj, "sports", {
            enumerable: false
        });
        console.log(obj.propertyIsEnumerable("sports")); // false
              
        for (var name in obj) {
            console.log(name);
        }
      
      1. {enumerable: false}로 열거 불가 설정
      2. for-in 문에서 프로퍼티가 열거되지 않습니다.
      3. Object(ES5)에서 다룹니다.

defineProperty 함수는 ES5에서 나왔습니다.
위의 코드는 enumerable: false를 만들기 위해 사용했습니다.
이것은 열거할 수 없는 상태로 설정하는 것입니다.

  • 첫번째 파라미터 : 오브젝트
  • 두번째 파라미터 : 프로퍼티 이름

그리고 {} 중괄호에다가 enumerable: false를 작성하면 sports 프로퍼티를 열거할 수 없는 상태로 설정합니다.
즉, for in 문으로 돌려도 나오지 않습니다.

이와 같이 ES5에서는 프로퍼티를 열거하거나 삭제하거나 변경하거나, 그런 함수들이 추가되었습니다.
이에 대해선 뒤에 ES5 강좌에서 다루겠습니다.