__proto__
를 통해 접근 가능하다.Object.getOwnPropertyDescriptor
메서드로 반환되는 값을 프로퍼티 디스크립터 객체라 한다.const person = {
name: 'Lee'
};
// 프로퍼티 어트리뷰트 정보를 제공하는 프로퍼티 디스크립터 객체를 반환한다.
console.log(Object.getOwnPropertyDescriptor(person, 'name'));
// {value: "Lee", writable: true, enumerable: true, configurable: true}
데이터 프로퍼티
키와 값으로 구성된 일반적인 프로퍼티. 지금까지 살펴본 모든 프로퍼티이다.
접근자 프로퍼티
Object.defineProperty
, Object.defineProperties
메서드로 정의 가능객체는 변경 가능한 값이므로 재할당 없이 직접 변경할 수 있다. 추가, 삭제, 갱신 및 재정의 가능. 이를 막기 위한 다양한 메서드를 제공한다.
Object.preventExtensions
. 추가금지Object.seal
.읽기와 쓰기만 가능Object.freeze
.읽기만 가능Object.isExtensible
메서드로 확인 가능.위의 변경 방지 메서드들은 얕은 변경 방지(shallow only)이다. 직속 프로퍼티만 변경이 방지되고 중첩 객체까지는 영향을 주지 못한다.
읽기 전용의 불변 객체를 구현하려면 객체를 값으로 갖는 모든 프로퍼티에 대해 재귀적으로 Object.freeze
메서드를 호출해야 한다.
function deepFreeze(target) {
if (target && typeof target === 'object' && !Object.isfrozen(target)) {
Object.freeze(target);
Object.keys(target).forEach(key => deepFreeze(target[key]));
}
return target;
}
new 연산자와 함께 object 생성사 함수를 호출 const person = new Object();
생성된 객체를 인스턴스라 한다.
반드시 생성자 함수를 사용해 빈 객체를 생성해야 하는 것은 아니다. 객체 리터럴을 사용하는 것이 더 간편하다. 특별한 이유가 없다면, 그다지 유용해 보이지 않는다??
식별자와 값을 연결하는 과정을 의미한다. 변수 선언은 변수 이름과 확보된 메모리 공간의 주소를 바인딩 하는 것이다. this 바인딩은 this와 this가 가리킬 객체를 바인딩 하는 것이다.
일반 객체는 호출할 수 없지만 함수는 호출할 수 있다. → 함수 객체는 일반 객체가 가지고 있는 내부 슬롯과 내붑 메서드는 물론, 함수로서 동작하기 위해 함수 객체만을 위한 [[Environment]], [[FormalParameters]] 등의 내부 슬롯과 [[Call]], [[Construct]] 같은 내부 메서드를 추가로 가지고 있다.
내부 메서드 [[Call]]을 갖는 함수 객체를 callable ⇒ 호출할 수 있는 객체 즉 함수
내부 메서드 [[Construct]]을 갖는 함수 객체를 constructor ⇒ 생성자 함수로서 호출할 수 있는 함수
함수 정의 방식에 따라 구분
일반 함수와 생성자 함수에 특별한 형식적 차이는 없다. 따라서 생성자 함수는 일반적으로 첫 문자를 대문자로 기술하는 파스칼 케이스로 명명하여 일반 함수와 구별할 수 있도록 하자!