접근자 프로퍼티 fullName의 프로퍼티 어트리뷰트 [[Get]]의 값, 즉 getter 함수를 호출하여 그 결과를 반환한다.
프로퍼티 fullName의 프로퍼티 어트리뷰트 [[Get]]의 값은 Object.getOwnPropertyDescriptor 메서드가 반환하는 프로퍼티 디스크립터(PropertyDescriptor) 객체의 get 프로퍼티 값과 같다.
+ 접근자 프로퍼티와 데이터 프로퍼티 구별법
Object.getOwnPropertyDescriptor 메서드가 반환한 프로퍼티 어트리뷰트를 객체로 표현한 프로퍼티 디스크립터 객체 비교하면 됨
// 일반 객체의 __proto__는 접근자 프로퍼티다.Object.getOwnPropertyDescriptor(Object.prototype,'__proto__');// {get: ƒ, set: ƒ, enumerable: false, configurable: true}// 함수 객체의 prototype은 데이터 프로퍼티다.Object.getOwnPropertyDescriptor(function(){},'prototype');// {value: {...}, writable: true, enumerable: false, configurable: false}
16.4 프로퍼티 정의
새로운 프로퍼티를 추가하면서 프로퍼티 어트리뷰트를 명시적으로 정의하거나, 기존 프로퍼티의 프로퍼티 어트리뷰트를 재정의하는 것을 말함
(단일 프로퍼티)Object.defineProperty, (다수 프로퍼티)Object.defineProperties로 프로퍼티 어트리뷰트 정의 가능
16.1 내부 슬롯과 내부 메서드
[[...]])로 감싼 이름이 내부 슬롯과 내부 메서드임[[Prototype]]내부 슬롯을 가지며,__proto__를 통해 간접적으로 접근 가능16.2 프로퍼티 어트리뷰트와 프로퍼티 디스크럽터 객체
valuewritableenumerableconfigurable[[Value]],[[Writable]],[[Enumerable]],[[Configurable]]을 뜻함.Object.getOwnPropertyDescriptor, (모든 프로퍼티)Object.getOwnPropertyDescriptors메서드로 간접적으로 확인 가능16.3 데이터 프로퍼티와 접근자 프로퍼티
16.3.1 데이터 프로퍼티
[[Value]]value[[Value]]에 값을 재할당한다.이때 프로퍼티가 없으면 프로퍼티를 동적 생성하고 생성된 프로퍼티의
[[Value]]에 값을 저장한다.[[Writable]]writable[[Writable]]의 값이false인 경우 해당 프로퍼티의[[Value]]의 값을 변경할 수 없는 읽기 전용 프로퍼티가 된다.[[Enumerable]]enumerable[[Enumerable]]의 값이false인 경우 해당 프로퍼티는for...in문이나Object.keys메서드 등으로 열거할 수 없다.[[Configurable]]configurable[[Configurable]]의 값이 false인 경우 해당 프로퍼티의 삭제, 프로퍼티 어트리뷰트 값의 변경이 금지된다. 단,[[Writable]]이true인 경우[[Value]]의 변경과[[Writable]]을false로 변경하는 것은 허용된다.[[Value]]의 값은 프로퍼티 값으로 초기화되며[[Writable]],[[Enumerable]],[[Configurable]]의 값은true로 초기화16.3.2 접근자 프로퍼티
[[Get]]get[[Get]]의 값, 즉 getter 함수가 호출되고 그 결과가 프로퍼티 값으로 반환된다.[[Set]]set[[Set]]의 값, 즉 setter 함수가 호출되고 그 결과가 프로퍼티 값으로 저장된다.[[Enumerable]]enumerable[[Enumerable]]과 같다.[[Configurable]]configurable[[Configurable]]과 같다.fullName으로 프로퍼티 값에 접근하면 내부적으로[[Get]]내부 메서드 호출👇 세부 동작 설명
person객체에fullName프로퍼티가 존재한다.fullName프로퍼티가 데이터 프로퍼티인지 접근자 프로퍼티인지 확인한다.fullName프로퍼티는 접근자 프로퍼티다.fullName의 프로퍼티 어트리뷰트[[Get]]의 값, 즉getter함수를 호출하여 그 결과를 반환한다.프로퍼티
fullName의 프로퍼티 어트리뷰트[[Get]]의 값은Object.getOwnPropertyDescriptor메서드가 반환하는 프로퍼티 디스크립터(PropertyDescriptor) 객체의get프로퍼티 값과 같다.+ 접근자 프로퍼티와 데이터 프로퍼티 구별법
Object.getOwnPropertyDescriptor메서드가 반환한 프로퍼티 어트리뷰트를 객체로 표현한 프로퍼티 디스크립터 객체 비교하면 됨16.4 프로퍼티 정의
Object.defineProperty, (다수 프로퍼티)Object.defineProperties로 프로퍼티 어트리뷰트 정의 가능value[[Value]]undefinedget[[Get]]undefinedset[[Set]]undefinedwritable[[Writable]]falseenumerable[[Enumerable]]falseconfigurable[[Configurable]]false16.5 객체 변경 방지
추가
삭제
읽기
쓰기
재정의
Object.preventExtensionsObject.sealObject.freeze16.5.1 객체 확장 금지
Object.preventExtensions(<객체>): 특정 객체 확장 금지 (프로퍼티 추가 금지)Object.isExtensible(<객체>): 확장 가능한 객체인지 체크16.5.2 객체 밀봉
Object.seal(<객체>): 특정 객체 밀봉 (프로퍼티 추가 및 삭제, 프로퍼티 어트리뷰트 재정의 금지)Object.isSealed(<객체>): 밀봉된 객체인지 체크16.5.3 객체 동결
Object.freeze(<객체>): 객체 동결 (프로퍼티 추가 및 삭제, 프로퍼티 어트리뷰트 재정의 금지, 프로퍼티 값 갱신 금지)Object.isFrozen(<객체>): 동결된 객체인지 체크16.5.4 불변 객체