-
[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
'To infinity > Javascript 이론' 카테고리의 다른 글
[Javascript] 함수 호출방식과 this 바인딩 (related to 생성자 함수) (0) 2021.06.14 [Javascript] 호이스팅 Hoisting and 변수키워드 var, let, const (feat. 둘리) (0) 2021.06.13 [Javascript] 실행컨텍스트 flow (코드실행 시 일어나는 과정) (0) 2021.06.12 [Javascript] 스코프 scope (유효범위) (0) 2021.06.10 [Javascript] 모듈 Module (0) 2021.06.10