내부 슬롯과 내부 메서드는 자바스크립트의 엔진 구현 알고리즘을 설명하기 위해 사용하는 의사 프로퍼티와 의사 메서드이다.
자바스크립트 엔진은 프로퍼티를 생성할 때 프로퍼티의 상태를 나타내는 프로퍼티 어트리뷰트를 기본 값으로 자동 정의한다. 프로퍼티 어트리뷰트의 내부 상태 값인 내부 슬롯에는 [[value]], [[Writable]], [[Enumerable]], [[Configurable]]이 있다.
const person = {
name : "kim"
}
//Object.getOwnPropertyDescriptor 메서드는 프로퍼티 어트리뷰트의 정보를 제공하는 프로퍼티 디스크립터 객체를 반환한다.
Object.getOwnPropertyDescriptor(person, 'name');
//{value : "kim", writable : true, enumerable : true, configurable : true}
지금까지 살펴본 일반적인 프로퍼티를 데이터 프로퍼티라고 한다. 데이터 프로퍼티는 위의 4가지 프로퍼티 어트리뷰트가 기본값으로 자동 정의된다.
접근자 프로퍼티는 자체적으로 값을 갖지 않고 다른 데이터 프로퍼티의 값을 읽거나 저장할 때 사용하는 접근자 함수로 구성된 프로퍼티이다. [[Get]], [[Set]], [[Enumerable]], [[Configurable]] 프로퍼티 어트리뷰트를 갖는다. 접근자 함수는 getter/setter 함수라고도 부른다. 모두 정의할 수 도, 하나만 정의할 수도 있다.
const person = {
//데이터 프로퍼티
firstname: "GilDong",
lastname : "Hong"
//getter 함수
get fullname() {
return `${this.firstname} ${this.lastname}`;
}
//setter 함수
set fullName(name){
//배열 디스트릭처링 할당
[this.firstname,this.lastname] = name.split("");
}
}
console.log(person.firstname + "" + person.lastname); //GilDong Hong
const person = {};
//데이터 프로퍼티 정의
object.defineProperty(person, 'firstName' , {
value: "Gildong",
writable : true,
enumerable : true,
configurable: true
});
const person = {firstname: "GilDong"};
object.preventExtensions(person);
person.age = 20; //무시된다. delete 메서드로 삭제는 가능.