ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Javascript] 프로퍼티 어트리뷰트 (프로퍼티 상세속성 바꾸기)
    To infinity/Javascript 이론 2021. 6. 13. 12:14

    2021.06.13 Ver1

     

     

    자바스크립트: 객체object 기반의 프로그래밍 언어 (함수와 객체는 분리할 수 없다!)

     

    원시타입: 단 하나의 값

    객체타입: 다양한 타입의 값

     

    객체 = 0개 이상의 프로퍼티로 구성된 집합

    프로퍼티 = key + value

     

    프로퍼티: 객체의 상태를 나타내는 값 (data) // 음, 객체의 값이라고 생각하면 될 듯

    메서드: 프로퍼티를 참조하고 조작할 수 있는 동작 (behavior) // 프로퍼티 값이 함수일 경우 일반함수와 구분을 위해 메서드 method라고 부름, 객체 값 중 함수

     

    1. 내부슬롯과 내부메서드

    - 자바스크립트 엔진의 내부로직으로 직접 접근 및 호출이 불가능함.

    - 하지만 일부에 한해 간접적으로 접근할 수 있음

    Ex. [[Prototype]] 내부슬롯에는 __proto__를 통해 간접적으로 접근 가능

     

    2. 프로퍼티 어트리뷰트와 프로퍼티 디스크립터 객체

    - 프로퍼티 어트리뷰트(attribute, 속성): 프로퍼티 상태를 나타냄

    - 프로퍼티 디스크립터(descriptor, 설명): 프로퍼티 어트리뷰트의 정보를 제공함

     

    3. 프로퍼티의 구분

    - 데이터 프로퍼티: 키와 값으로 구성된 일반적인 프로퍼티

    - 접근자 프로퍼티: 자체적으로는 값을 갖지 않고 다른 데이터 프로퍼티의 값을 읽거나 저장할 때 호출되는 접근자 함수로 구성된 프로퍼티(getter, setter)

     

    1) 데이터 프로퍼티

    - 자바스크립트 엔진이 프로터피를 생성할 때 기본값으로 자동정의됨.

     

    - value: 프로퍼티 값에 접근하면 반환되는 값

    - writable: 프로퍼티 값의 변경 가능 여부, 불리언 값, false일 경우 읽기전용

    - enumerable: 프로퍼티 값의 열거 가능 여부, 불리언 값, false일 경우 for..in문이나 Object.keys메서드 등으로 열거 불가.

    - configurable: 프로퍼티의 재정의 가능여부, 불리언 값, false일 경우 해당 프로퍼티의 삭제, 어트리뷰트 값 변경 금지됨.

                        단, writable이 ture인 경우 value변경과 writable을 false로 변경하는 것은 가능

     

    참고. 프로토타입: 어떤 객체의 상위(부모)객체 역할을 하는 객체

     

    4. 프로퍼티 정의

    - Object.defineProperty 메서드를 통해 프로퍼티 어트리뷰트를 정의하거나 재정의 할 수 있다.

    - 정의 시 생략된 어트리뷰터의 기본값:

      -- value, get, set : undefined

      -- writable, enumerable, configurable : false

     

    5. 객체 변경 방지

    - 객체는 변경가능한 값이므로 재할당 없이 직접 변경할 수 있기에 객체의 변경을 방지하는 다양한 메서드 존재.

    - 오 이방법으로 const 키워드로 정의한 객체에 대한 속성값을 동결시키면 마치 상수처럼 만들 수 있겠다.

     

    객체변경방지

     

    1) 객체 확장 금지 (Object.preventExtensions)

    - 프로퍼티 추가방법: 동적추가, Object.defineProperty 메서드 2가지 -> 모두 금지됨

    - 확장가능여부 확인: Object.isExtensible

     

    2) 객체 밀봉 (Object.seal)

    - 읽기 쓰기만 가능 (즉, 값을 변경하는 것이 가능)

    - 밀봉객체여부 확인: Object.isSealed

     

    3) 객체 동결 (Object freeze)

    - 읽기만 가능

    - 동결객체여부확인 : Object.isFrozen

     

    -> 얕은 변경방지 shallow only로 직속 프로퍼티만 변경이 방지되고 중첩객체까지는 못 바꿈.

     

    6. 불변객체

    - 중첩객체까지 freeze를 위해선 모든 프로퍼티에 대해 재귀적으로 Object.freeze 메서드를 호출해야함

    즉, 모든 프로퍼티에게 freeze를 걸어줘야 하는 것임

    - 반복문 사용, 콜백함수 사용.

     

    결론! 프로퍼티 어트리뷰터와 디스크립터를 통해서 프로퍼티의 상세속성을 커스터마이징 할 수 있다!

     

     

    [참고] 식별자네이밍

    - 변수, 함수 = 카멜케이스 firstName

    - 생성자함수 클래스이름 = 파스칼케이스 FirstName

    - 상수 = 스네이크케이스, all대문자 FIRST_NAME

Designed by Tistory.