- 내부 슬롯과 내부 메서드
: 자바스크립트 엔진의 구현 알고리즘을 설명하기 위해 ECMAScript 사양에서 사용하는 pseudo property, pseudo method

실제 ECMAScript 문서를 확인해보면, 자바스크립트 내부 동작을 설명하기 위해 정의되었고, 내부 관련된 메서드에 의해 명시된 대로 동작한다고 작성되어 있다.
쉽게 말하면, 존재하지만 실존하지는 않는 그런 값이라는 것!
내부 슬롯과 내부 메서드는 자바스크립트 내부 로직에 작성되어 있기에 개발자의 직접적인 접근이 불가능하지만, 일부에 한해 간접적으로 접근할 수 있는 수단을 제공한다.
- 프로퍼티 어트리뷰트와 프로퍼티 디스크립터 객체
: 프로퍼티는 키와 값으로 구성되는데, name: ‘jiyeon’ 과 같은 형태다.

이와 같은 프로퍼티가 생성될 때는 프로퍼티의 상태를 나타내는 프로퍼티 어트리뷰트를 기본값으로 자동 정의한다.
1) value: 프로퍼티 값
2) writable: 값의 갱신 가능 여부
3) enumerable: 열거 가능 여부
4) configurable: 재정의 가능 여부
getOwnPropertyDescriptor 메서드를 이용해 간접적으로 확인이 가능하며, 이 때 반환되는 객체를 프로퍼티 디스크립터 객체라고 한다.

- 데이터 프로퍼티와 접근자 프로퍼티
- 데이터 프로퍼티
- 접근자 프로퍼티
: 키와 값으로 구성된 일반적인 프로퍼티로, 위에서 언급한 프로퍼티 어트리뷰트를 갖는다.
1) [[Value]] : 프로퍼티 키를 통해 프로퍼티 값에 접근하면 반환되는 값
2) [[Writable]] : 프로퍼티 값의 변경 가능 여부를 나타내며 불리언 값을 갖는다.
3) [[Enumerable]] : 프로퍼티의 열거 가능 여부를 나타내며 불리언 값을 갖는다.
4) [[Configurable]] : 프로퍼티의 재정의 가능 여부를 나타내며 불리언 값을 갖는다.
여기서…
Writable과 Configurable 어트리뷰트의 차이점이 헷갈릴 수도 있는데,
Writable의 경우에는 프로퍼티 값!! 을 변경할 수 있는 가를 말하며, Configurable의 경우에는 프로퍼티 어트리뷰트!!의 값을 변경할 수 있는 가를 말한다.
Writable = true 라면, 위에서 person.name= ‘jiyeon’에서 person.name=’zena’로의 변경이 가능
Configurable = true 라면, person.name이 갖는 어트리뷰트들의 저장된 값을 true ⇒ false 혹은 false ⇒ true로 변경이 가능
: 자체적인 값이 존재하지 않으며, 다른 데이터 프로퍼티의 값을 읽거나 저장할 때 호출되는 접근자 함수로 구성된 프로퍼티
1) [[Get]] : 접근자 프로퍼티를 통해 데이터 프로퍼티의 값을 읽을 때 호출되는 접근자 함수로, getter 함수가 호출되고 그 결과가 프로퍼티 값으로 반환된다.
2) [[Set]] : 접근자 프로퍼티를 통해 데이터 프로퍼티의 값을 저장할 때 호출되는 접근자 함수로, setter 함수가 호출되고 그 결과가 프로퍼티 값으로 저장된다.
3) [[Enumerable]] : 데이터 프로퍼티와 동일
4) [[Configurable]] : 데이터 프로퍼티와 동일




위와 같은 경우, person의 firstName, lastName의 writable 프로퍼티 어트리뷰트 값은 true!

이 때, fullName 함수는 자체적으로 값을 가지지 않고, 데이터 프로퍼티의 값을 읽거나 저장하는 데 관여하기만 한다.
- 프로퍼티 정의
: 새로운 프로퍼티를 추가하면서 프로퍼티 어트리뷰트를 명시적으로 정의하거나, 기존 프로퍼티의 프로퍼티 어트리뷰트를 재정의하는 것을 말한다.



writable 값을 false로 지정한 경우, 해당 프로퍼티의 값이 변경되지 않음을 알 수 있다.
- 객체 변경 방지
1) Object.preventExtensions
: 객체 확장 금지
프로퍼티의 추가가 금지된다.
2) Object.seal
: 객체 밀봉
읽기와 쓰기만 가능하다.
3) Object.freeze
: 객체 동결
읽기만 가능하다.
위 세 가지의 변경 방지 메서드들은 얕은 변경 방지로 직속 프로퍼티에만 적용되는데, 객체의 중첩 객체까지 동결하여 변경이 불가능한 읽기 전용의 불변 객체를 구현하기 위해서는 객체를 값으로 갖는 모든 프로퍼티에 대해 재귀적으로 Object.freeze 메서드를 호출해야 한다.