Internal Slot, Internal Method

- 자바스크립트 엔진의 구현 알고리즘을 설명하기 위해 ECMAScript 사양에서 사용하는 의사 프로퍼티와 의사 메서드다.

- 이중 대괄호로 감싼 이름들이 내부 슬롯과 내부 메서드다. [[]]

- ECMAScript 사양에 정의된 대로 구현되어 자바스크립트 엔진에서 실제로 동작하지만 개발자가 직접 접근할 수 있도록 외부로 공개된 객체의 프로퍼티는 아님.

- 모든 객체는 [[Prototype]]이라는 내부 슬롯을 가진다. 

   - 내부 슬롯은 자바스크립트 엔진의 내부 로직이므로 원칙적으로 접근할 수 없지만, __proto__를 통해 간접적으로 접근할 수 있다.

Property Attribute, Property Descriptor 

- js엔진은 프로퍼티를 생성할 때, 프로퍼티의 상태를 나타내는 프로퍼티 어트리뷰트를 기본값으로 자동 정의한다.

   - 프로퍼티 상태 : 프로퍼티의 값, 값의 갱신 여부, 열거 가능 여부, 재정의 가능여부를 말함.

- 프로퍼티 어트리뷰트는 js엔진이 관리하는 내부 상태 값인 내부 슬롯이다. 

   - [[Value]], [[Writable]], [[Enumerable]], [[Configurable]]

   - 직접 접근은 할 수 없지만 Object.getOwnPropertyDescriptor 메서드로 확인할 수 있음.

const person = {
	name: 'Lee'
};

person.age = 20;

//프로퍼티 디스크립터 객체를 반환함.
console.log(Object.getOwnPropertyDescriptors(person));

/*
{
	name: {value:"Lee", writable: true, enumerable: true, configurable: true},
    age: {value:20, writable:true, enumerable: true, configurable:true}
}
*/

 

Data Property, Accessor Property

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

   - 데이터 프로퍼티는 프로퍼티 어트리뷰트들을 가짐.

   - [[Value]], [[Writable]], [[Enumerable]], [[Configurable]]

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

   - [[Get]], [[Set]], [[Enumerable]], [[Configurable]]

 

const person = {
	firstName: 'Ungmo',
    lastName: 'Lee',
    
    //getter 함수
    get fullName() {
    	return `${this.firstName} ${this.lastName}`;
    }
    //setter 함수
    set fullName(name) {
    	//배열 디스트럭처링 할당
    	[this.firstName, this.lastName] = name.split(' ');
    }
};

console.log(person.firstName + ' ' + person.lastName);

person.fullName = 'Heegun Lee';
console.log(person);

console.log(person.fullName);

- person객체의 firstName과 lastName 프로퍼티 -> 데이터 프로퍼티

- get, set 함수 이름 fullName -> 접근자 프로퍼티

 

- 접근자 프로퍼티 fullName으로 프로토타 값에 접근하면, 내부적으로 [[Get]]이 호출됨.

- 프로토타입 체인에서 프로퍼티를 검색해서 person 객체에서 fullName프로퍼티가 존재함을 확인.

프로토타입
- 어떤 객체의 상위 객체의 역할을 하는 객체
- 하위(자식) 객체에게 자신의 프로퍼티와 메서드를 상속

프로토타입 체인
- 프로토타입이 단방향 링크드리스트형태로 연결되어 있는 상속 구조를 말함.
- 객체의 프로퍼티나 메서드에 접근하려고 할 때, 해당 객체에 접근하려는 프로퍼티나 메서드가 없다면 프로토타입 체인을 따라 프로토타입의 프로토타입나 메서드를 차례대로 검색함.

 

프로퍼티 정의

- Object.defineProperty 메서드를 사용해서 프로퍼티의 어트리뷰트를 정의할 수 있음.

- 여러 개는 Object.defineProperties 메서드를 사용

 

객체 변경 방지 메소드

구분 메서드 프로퍼티
추가
프로퍼티
삭제
프로퍼티
값 읽기
프로퍼티
값 쓰기
프로퍼티 
어트리뷰트
재정의
객체 확장 금지 Object.preventExtensions X O O O O
객체 밀봉 Object.seal X X O O X
객체 동결 Object.freeze X X O X X

 

- 객체 확장 금지 : 프로퍼티 추가 금지

- 객체 밀봉 : 읽기와 쓰기만 가능

- 객체 동결 : 읽기만 가능

'Javascript' 카테고리의 다른 글

[js] 함수와 일급 객체  (2) 2025.01.21
[js] 생성자 함수에 의한 객체 생성  (5) 2025.01.21
[js] var, let, const  (4) 2025.01.16
[js] 스코프  (3) 2025.01.14
[js] 객체에 대해서 ...  (1) 2025.01.13

+ Recent posts