자체적으로는 값을 가지고 있지 않고 다른 데이터 프로퍼티의 값을 읽거나 저장할 때 호출되는 접근자 함수(accessor function)로 구성된 프로퍼티
일반 객체의 __proto__ 는 접근자 프로퍼티
데이터 프로퍼티
[[value]] : 프로퍼티 키를 통해 프로퍼티 값에 접근하면 반환되는 값
[[Writable]] : 프로퍼티 값의 변경 가능 여부를 나타내며 불리언 값을 가짐
[[Enumerable]] : 프로퍼티의 열거 가능 여부를 나타내며 불리언 값을 가짐
[[Configurable]] : 프로퍼티의 재정의 가능 여부를 나타내며 불리언 값을 가짐
접근자 프로퍼티
[[Get]] : 접근자 프로퍼티를 통해 데이터 프로퍼티의 값을 읽을 때 호출되는 접근자 함수
[[Set]] : 접근자 프로퍼티를 통해 데이터 프로퍼티의 값을 저장할 때 호출되는 접근자 함수
[[Enumerable]] : 데이터 프로퍼티 [[Enumerable]] 와 같음
[[Configurable]] : 데이터 프로퍼티 [[Configurable]] 와 같음
const person = {
firstName = 'jisu',
lastName = 'Lee'.
//fullName은 접근자 함수로 구성된 접근자 프로퍼티임
//getter 함수
get fullName() {
return `${this.firstName} ${this.lastName}`
}
//setter 함수
set fullName(name) {
[this.firstName, this.lastName] = name.split(' ');
}
};
//데이터 프로퍼티를 통한 값의 참조
console.log(person.firstName + ' ' + person.lastName);
//접근자 프로퍼티를 통한 값의 저장
//setter 함수 호출
person.fullName = 'Heegun Lee';
//getter 함수 호출
console.log(person.fullName);
동작 과정 1. 프로퍼티 키가 유효한지 확인. 프로퍼티 키는 문자열 또는 심벌이어야 함 2. 프로퍼티 체인에서 프로퍼티 검색. person 객체에서 fullName 프로퍼티 존재함 3. 검색된 fullName 프로퍼티가 데이터 프로퍼티인지 접근자 프로퍼티인지 확인 4. 접근자 프로퍼티 fullName의 프로퍼티 어트리뷰트 [[Get]]의 값, 즉 getter 함수를 호출해 그 결과를 반환
프로토타입
어떤 객체의 상위 객체의 역할을 하는 객체
프로토타입은 하위 객체에게 자신의 프로퍼티와 메서드를 상속함
하위 객체는 상속받은 프로토타입 객체의 프로퍼티나 메소드를 자유롭게 사용 가능
프로토타입 체인
프로토타입이 단방향 링크드 리스트 형태로 연결되어 있는 상속 구조
객체의 프로퍼티나 메서드에 접근하려고 할 때 해당 객체에 접근하려는 프로퍼티 또는 메서드가 없다면 프로토타입 체인을 따라 프로토타입의 프로퍼티나 메서드를 차례대로 검색함
프로퍼티 정의
새로운 프로퍼티를 추가하면서 프로퍼티 어트리뷰트를 명시적으로 정의하거나 기존 프로퍼티의 프로퍼티 어트리뷰트를 재정의하는 것
Object.defineProperty 메서드를 사용해 정의할 수 있음. 인수로 객체의 참조, 데이터 프로퍼티의 키인 문자열, 프로퍼티 디스크립터 객체 전달
한번에 하나의 프로퍼티 정의 가능. Object.defineProperties를 사용하면 여러 개의 프로퍼티 한 번에 정의 가능
const person = {};
Object.defineProperty(person, 'firstName', {
value : 'jisu',
writable : true,
enumerable : true,
configurable : true
});
Object.defineProperty(person, 'lastName', {
value : 'Lee'
});
객체 변경 방지
객체는 변경 가능한 값이므로 재할당 없이 변경 가능. 즉, 프로퍼티 추가,삭제,값 갱신, 프로퍼티 어트리뷰트 재정의 가능
객체의 변경을 방지하기 위한 다양한 메서드 제공 => 얕은 변경 방지로 직속 프로퍼티만 변경이 방지되고 중첩 객체까지 영향 주지 못함
객체 확장 금지 => Object/preventExtensions
객체 밀봉 => Object.seal
객체 동결 => Object.freeze
객체 확장 금지
프로퍼티 추가 금지
프로퍼티 동적 추가 금지
Object.definedProperty 금지
확장 가능여부는 Obeject.isExtensible로 확인 가능
객체 밀봉
추가 및 삭제, 프로퍼티 어트리뷰트 재정의 금지
읽기, 쓰기만 가능
밀봉된 객체인지 확인 여부는 Obeject.isSealed로 확인 가능
객체 동결
읽기만 가능
Obeject.isFrozen로 확인 가능
불변 객체
객체의 중첩 객체까지 동결해 변경이 불가능한 읽기 전용의 불변 객체를 구현하려면 객체를 값으로 갖는 모든 프로퍼티에 대해 재귀적으로 Object.freeze 메서드 호출해야 함