LHJ

I'm a FE developer.

17-5. Object 오브젝트(ES5 기준) / 프로퍼티 추출

06 Dec 2020 » js_beginner

17-5. Object 오브젝트(ES5 기준) / 프로퍼티 추출

getPrototypeOf()

구분데이터(값)
objectObject 오브젝트
파라미터대상 인스턴스
반환프로퍼티

  • 파라미터의 prototype에 연결된 프로퍼티 반환

      function Book(point) {
          this.point = point;
      }
      Book.prototype.getPoint = function () {};
      Book.prototype.setPoint = function () {};
      var obj = new Book(100);
        
      var result = Object.getPrototypeOf(obj);
      for (var key in result) {
          console.log(key + ":" + result[key]);
      }
      // getPoint: function(){}
      // setPoint: function(){}
    
    1. 파라미터에 인스턴스를 작성합니다.
    2. 인스턴스를 생성항 function 오브젝트의 prototype에 연결된 프로퍼티를 반환
    3. 생성자 함수인 Book을 작성하거나 Book.prototype을 작성하면 반환하지 않습니다.
    4. this.point는 prototype에 연결되어 있지 않으므로 반환되지 않습니다.

  • 참고

    • setPrototypeOf()가 ES5 스펙에 없고 ES6에 있음

get이 있으면 set이 있어야됩니다.
설정도 안했는데 불러오는 것은 이상하지 않습니까?
그리고 반대로 set이 있으면 get이 있어야됩니다.
get이 없는데 set만 하는건 이상하잖아요?

즉, getset은 하나의 짝입니다.
물론 get이 2~3개있고, set은 하나만 있을 수도 있습니다.
그 반대일 수도 있습니다.
set을 두 개로 분할해서 한 다음에 하나의 get으로 가져올 수 있는 겁니다.

그런데 ES5 스펙에 setPrototypeOf가 없습니다.
이것 때문에 예전에 한참 헤맸던 적이 있습니다.
get이 있으면 set이 있어야된다라는 것은 일반적이 통념입니다.


setPrototypeOf : 인스턴스.proto 이 부분에 설정합니다.
getPrototypeOfprototype에 있는 것을 가지고 오는데, setPrototypeOfprototype이 아니라 __proto__에 설정합니다.

음..? 이것도 이상한데.. 그리고 왜 ES5에서는 setPrototypeOf 이것을 할 수 없었을까요?

__proto__는 ES5 기준에선 표준이 아닙니다.
물론 브라우저에서는 지원을 했지만, ES5에 정의가 안되어있습니다.
그런데 ES6에 정의가 되어있습니다.
ES5에서 setPrototypeOf을 사용한다는 것은 __proto__에 설정한다는 것입니다.
즉, 이렇다할 표준이 없었기 때문에 setPrototypeOf를 ES5에서 사용할 수 없었다고 생각합니다.

getOwnPropertyNames()

구분데이터(값)
objectObject 오브젝트
파라미터대상 오브젝트
반환[프로퍼티 이름]

  • 오브젝트의 프로퍼티 이름을 배열로 반환
  • 열거 가능 여부를 체크하지 않음
    이것이 포인트입니다.
    enumerable을 체크하지 않습니다.
  • 자신이 만든 프로퍼티가 대상

    • 다른 오브젝트에서 받은 프로퍼티는 제외

        var obj = {};
        Object.defineProperties(obj, {
            // enumerable: true를 작성하지 않았으므로 디폴트값 false입니다.
            book: {value: ""},
            point: {value: 123}
        })
        var names = Object.getOwnPropertyNames(obj);
        for (var k = 0; k < names.length; k++) {
            console.log(names[k]);
        }
        // book
        // point
      

      getOwnPropertyNames열거가능 여부를 체크하지 않습니다.


keys()

구분데이터(값)
objectObject 오브젝트
파라미터대상 오브젝트
반환프로퍼티 이름

  • 열거 가능 프로퍼티 이름 반환

    • enumerable: true

        var obj = {};
        Object.defineProperties(obj, {
            book: {
                value: "",
                enumerable: true
            },
            point: {
                value: 123
            }
        })
        var names = Object.keys(obj);
        for (var k = 0; k < names.length; k++) {
            console.log(names[k]);
        }
        // book
      
      1. point는 enumerable: false이므로 반환되지 않음

getOwnPropertyNameskeysenumerable에서 차이가 있다.