LHJ

I'm a FE developer.

17-6. Object 오브젝트(ES5 기준) / 프로퍼티 디스크립터 함수

07 Dec 2020 » js_beginner

17-6. Object 오브젝트(ES5 기준) / 프로퍼티 디스크립터 함수

getOwnPropertyDescriptor()

구분데이터(값)
objectObject 오브젝트
파라미터첫번째 파라미터: 대상 오브젝트
두번째 파라미터: 프로퍼티 이름
반환디스크립터

  • 프로퍼티 디스크립터의 속성 이름, 값 반환

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

        var obj = {};
        Object.defineProperty(obj, "book", {
            value: "",
            writable: true,
            enumerable: true
        })
        var desc = Object.getOwnPropertyDescriptor(obj, "book");
        for (var key in desc) {
            console.log(key + ":" + desc[key]);
        }
        // value: 책
        // writable: true
        // enumerable: true
        // configurable: false
      

preventExtensions()

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

  • 오브젝트에 프로퍼티 추가 금지 설정
  • 프로퍼티 삭제, 변경은 가능
  • 추가 금지를 설정한 후에는 추가 가능으로 변경 불가

      var obj = {};
      Object.preventExtensions(obj);
      try {
          Object.defineProperty(obj, "book", {
              value: ""
          });
      } catch (e) {
          console.log("추가 불가");
      }
      // 추가 불가
    
    1. 추가 금지 상태에서 프로퍼티를 추가하면 에러 발생

    데이터를 보호하는 관점에서 이해하시면 됩니다.


isExtensible()

구분데이터(값)
objectObject 오브젝트
파라미터대상 오브젝트
반환true / false

  • 오브젝트에 프로퍼티 추가 금지 여부 반환

    • true: 추가 가능, false: 추가 불가

        var obj = {};
        Object.defineProperty(obj, "book", {
            value: "",
        })
        console.log(Object.isExtensible(obj)); // true
              
        Object.preventExtensions(obj);
        console.log(Object.isExtensible(obj)); // false
      

seal()

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

  • 오브젝트에 프로퍼티 추가, 삭제 금지 설정
  • 추가 금지는 오브젝트 단위로 설정하고 삭제 금지는 프로퍼티 단위로 설정

      var obj = {};
      Object.defineProperty(obj, "book", {
          value: "",
          writable: true
      })
        
      Object.seal(obj);
        
      try {
          Object.defineProperty(obj, "sports", {
              value: "스포츠"
          })
      } catch (e) {
          console.log("추가 불가");
      }
      // 추가 불가
    

  • 추가 금지를 하더라도 변경은 가능

isSealed()

구분데이터(값)
objectObject 오브젝트
파라미터대상 오브젝트
반환true/false

  • 오브젝트에 프로퍼티 추가, 삭제 금지 여부 반환

    • true: 불가, false: 가능

        var obj = {};
        Object.defineProperty(obj, "book", {
            value: "",
            writable: true
        })
        console.log(Object.isSealed(obj)); // false
              
        Object.seal(obj);
        console.log(Object.isSealed(obj)); // true
      

freeze()

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

  • 오브젝트에 프로퍼티 추가, 삭제, 변경 금지 설정

      var obj = {};
      Object.defineProperty(obj, "book", {
          value: "JS책",
          writable: true
      })
        
      Object.freeze(obj);
      try {
          Object.defineProperty(obj, "book", {
              value: "포인트"
          })
      } catch (e) {
          console.log("변경 불가");
      }
      // 변경 불가
      console.log(obj.book); // JS책
    

isFrozen()

구분데이터(값)
objectObject 오브젝트
파라미터대상 오브젝트
반환true/false

  • 오브젝트에 프로퍼티 추가, 삭제, 변경 금지 여부 반환

    • true: 불가, false: 가능

        var obj = {};
        Object.defineProperty(obj, "book", {
            value: "",
            writable: true
        })
        console.log(Object.isFrozen(obj)); // false
              
        Object.freeze(obj);
        console.log(Object.isFrozen(obj)); // true