자바스크립트는 객체(object) 기반의 프로그래밍 언어이며, 자바스크립트를 구성하는 거의 “모든 것”이 객체다. 원시 값을 제외한 나머지 값(함수, 배열, 정규 표현식 등)은 모두 객체다.
이웅모 , 『모던 자바스크립트 Deep Dive』, 위키북스(2020), p124.
const person = {
name: 'lee', // 프로퍼티 키: name, 프로퍼티 값: 'lee'
age: 32,
sayHi() {
console.log("hi"); // 메서드
}
}
- 원시 타입의 값, 즉 원시 값은 변경 불가능한 값(immutable value)이다. 이에 비해 객체(참조) 타입의 값, 즉 객체는 변경 가능한 값(mutable value)이다.
- 원시 값을 변수에 할당하면 변수(확보된 메모리 공간)에는 실제 값이 저장된다. 이에 비해 객체를 변수에 할당하면 변수(확보된 메모리 공간)에는 참조 값이 저장된다.
- 원시 값을 갖는 변수를 다른 변수에 할당하면 원본의 원시 값이 복사되어 전달된다. 이를 값에 의한 전달(pass by value)이라 한다. 이에 비해 객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달된다. 이를 참조에 의한 전달(pass by reference)이라 한다.
이웅모 , 『모던 자바스크립트 Deep Dive』, 위키북스(2020), p137.
내부 슬롯(internal slot)과 내부 메서드(internal method)는 ECMAScript 사양에 정의된 대로 구현되어 자바스크립트 엔진에서 실제로 동작하지만 개발자가 직접 접근할 수 있도록 외부로 공개된 객체의 프로퍼티는 아니다. …예를 들어, 모든 객체는 [[Prototype]]이라는 내부 슬롯을 갖는다. 내부 슬롯은 자바스크립트 엔진의 내부 로직이므로 원칙적으로 직접 접근할 수 없지만 [[Prototype]] 내부 슬롯의 경우, __proto__를 통해 간접적으로 접근할 수 있다.
이웅모 , 『모던 자바스크립트 Deep Dive』, 위키북스(2020), p220.
즉, 프로퍼티 어트리뷰트는 자바스크립트 엔진이 관리하는 내부 상태 값인 내부 슬롯이다. Prototype과 마찬가지로 직접 접근이 불가능하지만 Object.getOwnPropertyDescriptor 메서드를 사용해 간접적으로 확인할 수 있다.
const person = {
name: 'lee'
};
console.log(Object.getOwnPropertyDescriptor(person, 'name'));
// {value: "lee", writable: true, enumerable: true, configurable: true}
프로퍼티는 다음 두 형태로 구분할 수 있다.
각 프로퍼트 어트리뷰트에 대해 조금 더 자세히 알고 싶다면 You Don’t Know JS의 2번째 책 ‘this와 객체 프로토타입, 비동기와 성능’ 3장 객체 부분을 추천한다.
const person = {
name: 'Lee',
address: { city: 'Seoul' }
};
Object.freeze(person);
console.log(Object.isFrozen(person)); // true
console.log(Object.isFrozen(person.address)); // false
References
데이비드 플래너건 , 『자바스크립트 완벽 가이드』, 인사이트(2022)
더글러스 크락포드 , 『자바스크립트는 왜 그 모양일까?』, 인사이트(2020)
카일 심슨 , 『You Don’t Know JS - 타입과 문법, 스코프와 클로저』, 한빛미디어(2017)
이웅모 , 『모던 자바스크립트 Deep Dive』, 위키북스(2020)