728x90
내부 슬롯과 내부 메서드
JS 엔진 구현 알고리즘 -> 의사 프로퍼티(내부 슬롯), 의사 메서드(내부 메서드)
-> 일반적으로 접근이 불가하나 [[Prototype]] 과 같은 내부 슬롯은 proto로 접근가능
프로퍼티 어트리뷰트와 프로퍼티 디스크립터 객체
프로퍼티 생성 시 상태를 나타내는 어트리뷰트를 기본값으로 정의
-> 내부 슬롯으로 접근 불가하나 메서드를 사용한 간접 접근 가능
const person = {
name : 'Lee';
}
console.log(Object.getOwnPropertyDescripter(person, 'name'));
// {value : 'Lee', wriable : true, enumerable : true, configurable : true}
어트리뷰트 정보를 제공하는 디스크립터 객체를 반환하여 이를 출력함
(뒤에 복수형태인 s를 붙이면 전체적인 정보 제공)
데이터 프로퍼티와 접근자 프로퍼티
데이터 프로퍼티 : 키와 값으로 이루어진 프로퍼티(지금까지의 프로퍼티)
접근자 프로퍼티 : 값을 갖지않고 다른 데이터 프로퍼티의 값을 읽거나 저장할때 호출
/// 데이터, 접근자 프로퍼티 예시
const person = {
// 일반적인 데이터 프로퍼티
firstname = "jeong";
lastname = "woogi";
// 접근자 함수로서 저장된 데이터를 불러오는 getter 함수
get FullName() {
return `${this.firstname} ${this.lastname}`;
}
// 접근자 함수로서 데이터를 저장하는 setter 함수
set FullName(name) {
[this.firstname, this.lastname] = name.split(' ');
}
}
person.FullName = "jeong wooki";
console.log(person);
// {fistname : "jeong", lastname : "woogi"}
// FullName 에 값을 저장했으므로 setter 함수 호출
console.log(person.FullName);
// jeong wooki
// FullName에 접근했으므로 getter 함수 호출
}
- 접근자와 데이터 구별하기
일반 객체의 __proto__는 접근자 프로퍼티, 함수 객체의 prototype은 데이터
프로퍼티
-> 디스크립터 객체의 프로퍼티가 서로 다름
프로퍼티 정의
새 프로퍼티 정의 시, 어트리뷰트를 명시적으로 정의 or 기존의 것을 재정의
-> 객체의 프로퍼티의 동작을 명확히 정의 가능
// 프로퍼티 어트리뷰트 정의 메서드
Object.defineProperty(property, 'name') {
value : '???';
writable : true;
enumerable : true;
configurable : true;
}
위 객체의 프로퍼티를 지정하지 않을 경우 undefined, false가 기본값으로 지정
이것 또한 복수형태인 s를 뒤에 붙혀 여러가지 프로퍼티를 정의 가능
객체 변경 방지
객체는 변경 가능하기 때문에 다양한 방법으로 추가, 삭제, 재정의가 가능
무분별한 변경을 방지하기 위해 다양한 메서드 제공
Object.preventExtensions // 객체 확장 금지(추가 금지)
Object.seal // 객체 밀봉(추가, 삭제 금지)
Object.freeze // 객체 동결(읽기 제외 전부 금지)
기본적으로 이같은 프로퍼티 재정의와 추가, 삭제 등이 금지된 상태에서 금지된 것을
시도할 경우, 오류가 아닌 무시되어 넘어감
- 불변 객체
위의 메서드들은 '얕은 변경 방지'라 하여 중첩 객체까지 영향X
중첩 객체까지 전부 동결하기 위해 재귀호출을 통해 모든 프로퍼티를 동결해야함
'Front-End Study > 모던 자바 스크립트_DeepDive' 카테고리의 다른 글
모던 자바 스크립트 기본 개념 정리 (0) | 2024.03.27 |
---|---|
CH_17. 생성자 함수에 의한 객체 생성 (0) | 2023.11.18 |
CH_13. 스코프 (1) | 2023.11.18 |
CH_11. 원시 값과 객체의 비교 (1) | 2023.11.18 |