16. 프로퍼티 어트리뷰트
1) 내부 슬롯과 내부 메서드
- 자바스크립트 엔진의 구현 알고리즘을 설명하기 위해 ECMAScript에서 사양에서 사용하는 의사 프로퍼티와 의사 메서드를 내부 슬롯, 내부 메서드라 칭함('[[..]]'로 감싼 이름들)
- 기본적으로 직접 접근 불가
- 내부 슬롯 중 일부는 간접적으로 접근이 가능 ex. [[Prototype]]은 __proto__로 접근 가능
const o = {};
o.__proto__ // Object.prototype
2) 프로퍼티 어트리뷰트와 프로퍼티 디스크립터 객체
- 프로퍼티 생성 시 프로퍼티의 상태를 나타내는 프로퍼티 어트리뷰트를 기본값으로 자동 정의
- 프로퍼티 어트리뷰트란 프로퍼티 값, 값 갱신 가능여부, 열거 가능여부, 재정의 가능여부 나타냄
- 자바스크립트 엔진이 관리하는 내부 상태 값인 내부 슬롯으로는 [[Value]], [[Writable]], [[Enumerable]], [[Configurable]]이 있음
- 내부 슬롯은 마찬가지로 직접 접근이 불가하나, Object.getOwnPropertyDescriptor(s) 메서드로 간접 확인이 가능하며 매개변수로 객체 참조와 프로퍼티 키를 전달
- 간접 확인 시 프로퍼티 디스크립터 객체 반환됨
const person = {
name: 'Lee'
};
console.log(Object.getOwnPropertyDescriptor(person, 'name'));
// {value: "Lee", writable: true, enumerable: true, configurable: true}
3) 데이터 프로퍼티와 접근자 프로퍼티
1. 데이터 프로퍼티
- 일반적 프로퍼티
- 데이터 프로퍼티가 갖는 프로퍼티 어트리뷰트로는 [[Value]](프로퍼티 값), [[Writable]](값의 변경 가능여부, 불리언 타입), [[Enumerable]](값의 열거 가능여부, 불리언 타입), [[Configurable]](값의 재정의 가능여부, 불리언 타입)이 있음
2. 접근자 프로퍼티
- 그 자체로 값을 갖지 않으며, 값을 읽거나 저장할 때 사용하는 접근자 함수로 구성된 프로퍼티
- 접근자 프로퍼티가 갖는 프로퍼티 어트리뷰트로는 [[Get]](값 읽을 때 호출), [[Set]](값 저장할 때 호출), [[Enumerable]], [[Configurable]]이 있음
- 접근자 함수는 getter/setter 함수로도 불림
- 일반 객체의 __proto__는 접근자 프로퍼티, 함수 객체의 prototype은 데이터 프로퍼티로, 두 프로퍼티를 구별 가능함
const person = {
// 데이터 프로퍼티
firstName: 'Jung',
lastName: 'Lee',
//접근자 프로퍼티 중 getter과 setter 함수
get fullname() {
return '${this.firstName} ${this.lastName}';
}
set fullname(name) {
[this.firstName, this.lastName] = name.split(' ');
}
};
*프로토타입
- 어떤 객체의 상위(부모) 객체의 역할을 하는 객체
- 하위(자식) 객체에게 자신의 프로퍼티, 메서드를 상속
- 프로토타입 체인을 통해 상속 구조를 알 수 있음
4) 프로퍼티 정의
- 새로운 프로퍼티 추가 시 프로퍼티 어트리뷰트를 명시적으로 정의하거나, 기존 프로퍼티의 프로퍼티 어트리뷰트를 재정의하는 것이 가능
- 프로퍼티가 어떻게 동작해야 하는지 정의할 수 있다는 데에 그 의의가 있음
- Object.defineProperty(ies) 메서드로 정의가 가능하며, 인수로는 객체 참조와 데이터 프로퍼티 키, 그리고 프로퍼티 디스크립터 객체(일부 생략 가능하며, 생략 시 기본값 적용됨)를 전달
5) 객체 변경 방지
- 자바스크립트에서는 객체의 변경을 방지하는 다양한 메서드를 제공하며, 이 메서드들은 객체의 변경을 금지하는 그 강도에서 차이점을 가짐
1. 객체 확장 금지
- 프로퍼티 추가 금지
- Object.preventExtensions 메서드
- 객체의 확장 여부 확인은 Object.isExtensible 메서드 사용
- 프로퍼티 삭제는 가능
2. 객체 밀봉
- 프로퍼티 추가 및 삭제, 프로퍼티 어트리뷰트 재정의 금지(읽기와 쓰기만 가능)
- Object.seal 메서드
- 객체의 밀봉 여부 확인은 Object.isSealed 메서드 사용
- 프로퍼티 값 갱신은 가능
3. 객체 동결
- 프로퍼티 추가 및 삭제, 프로퍼티 어트리뷰트 재정의, 프로퍼티 값 갱신 금지(읽기만 가능)
- Object.freeze 메서드
- 객체의 동결 여부 확인은 Object.isFrozen 메서드 사용
4. 불변 객체
- 객체 확장 금지, 객체 밀봉, 객체 동결에 사용되는 메서드들은 얕은 변경 방지라 할 수 있음
- 직속 프로퍼티 뿐만 아니라, 중첩 객체까지 동결하는 깊은 변경 방지를 하는 것이 불변 객체로 만드는 방법임
- 객체를 값으로 갖는 모든 프로퍼티에 대해 재귀적으로 Object.freeze 메서드를 호출
참고 : 도서 <모던 자바스크립트 Deep Dive>
'TIL' 카테고리의 다른 글
<모던 자바스크립트 Deep Dive> 19장 프로토타입 요약 (0) | 2022.03.15 |
---|---|
<모던 자바스크립트 Deep Dive> 17~18장 생성자 함수에 의한 객체 생성, 함수와 일급 객체 요약 (0) | 2022.03.08 |
<모던 자바스크립트 Deep Dive> 15장 let, const 키워드와 블록 레벨 스코프 요약 (2) (0) | 2022.02.22 |
<모던 자바스크립트 Deep Dive> 15장 let, const 키워드와 블록 레벨 스코프 요약 (1) (0) | 2022.02.21 |
<모던 자바스크립트 Deep Dive> 14장 전역 변수의 문제점 요약 (0) | 2022.02.17 |