https://im-developer.tistory.com/140
자바스크립트의 Object, 즉 객체는 여러가지의 자료(Data)들과 함수(Function)들의 집합이다. 자바스크립트에서는 원시 데이터 타입인 Number, String, Boolean, Null, Undefined를 제외한 모든 것들을 다 Object type이라고 한다. 함수도, 배열도 모두 Object라는 큰 범주 안에 속한다.
객체는 **new Object()**나 Object.create(), 혹은 literal notation을 사용하여 초기화될 수 있다.
위와 같이 쓰여진 객체가 바로 literal notation으로 쓰여진 형태를 말한다.
객체 초기자(Object initializer)는 0개 이상의 속성명과 그에 해당하는 값의 목록이 {}(중괄호)에 묶여있다.
객체의 값에는 원시 데이터 타입 뿐만 아니라 배열, 객체, 함수가 들어갈 수도 있다.
객체 내부에 함수를 쓰고 그 안에서 this를 사용한다면 this는 그 함수가 존재하는 객체 자체를 가리킨다.
party 객체 코드를 보면 객체 안에 host, eventName 등의 값들이 저장된 것처럼 보이지만 사실은 저 property들은 실제 값이 저장된 메모리의 주소를 가리키고 있을 뿐이다. 만약 우리가 party.host를 'Jane'으로 바꾼다면 그것은 host라는 프로퍼티가 가리키고 있는 메모리 공간에서 이루어진다.
만약에 dessert 객체에 새로운 프로퍼티를 추가하고 싶으면 위와같이 할당 연산자를 사용해서 간단하게 추가할 수 있다. 만약에 위 코드처럼 값을 할당하여 속성을 추가하는 일반적인 방법을 사용하면 자동으로 enumerable과 configurable, writable 속성이 true로 설정된다.
즉, enumerable: true이기 때문에 값을 for...in문 등의 방법으로 열거할 수 있고,
configurable: true이기 때문에 delete 등을 사용하여 속성을 삭제할 수 있고,
writable: true이기 때문에 추후에 할당 연산자로 값을 변경할 수 있다.
Object.defineProperty()는 객체에 직접 새로운 속성을 정의하거나 이미 존재하는 속성을 수정한 후 그 객체를 반환한다. defineProperty() 메소드를 사용하면 enumerable, configurable 등의 속성을 상세하게 조절할 수 있고, 값을 getter나 setter를 사용하여 다른 객체나 변수에서 읽어올 수도 있다.
Object.defineProperty(obj, prop, descriptor);
Object.defineProperty() 메소드는 3개의 인자를 받는다.