모던자바스크립트 Deep Dive를 보면서 정리 중
자바스크립트를 구성하는 거의 모든 것이 객체다.
원시 값을 제외한 나머지 값(함수, 배열, 정규 표현식 등)은 모두 객체다.
원시 타입 값은 변경 불가, 단 하나의 값.
객체 타입 값은 변경 가능, 원시 값 또는 다른 객체로 구성.
객체는 0개 이상의 프로퍼티(키+값)로 구성됨.
var person = {
name: 'Lee',
age: 20
}
자바스크립트에서 사용할 수 있는 모든 값은 프로퍼티 값이 될 수 있다. 함수는 일급 객체이므로 마찬가지로 값(프로퍼티 값)으로 사용할 수 있다. 프로퍼티 값이 함수일 경우, 일반 함수와 구분하기 위해 메서드라 부른다.
var person = {
name: 'Lee', // 프로퍼티
age: 20
increase: function() { // 메서드
this.age++;
}
}
자바와 같은 객체지향 언어는 클래스를 사전에 정의하고 필요한 시점에 new 연산자와 함께 생성자를 호출하여 인스턴스를 생성하는 방식으로 객체 생성.
** 인스턴스 : 클래스에 의해 생성되어 메모리에 저장된 실체
js는 프로토타입 기반 객체지향 언어로서 클래스 기반 객체지향 언어와는 달리 다양한 객체 생성 방법을 지원한다.
중괄호({...}) 내에 0개 이상의 프로퍼티를 정의.
변수에 할당되는 시점에 js엔진은 객체 리터럴을 해석해 객체를 생성.
var person = {
name: 'Lee',
sayHello: function () {
console.log(`Hello! My name is ${this.name}.`);
}
};
console.log(typeof person); // object
console.log(person); // {name: "Lee", sayHellp: f}
var empty = {}; // 빈 객체
console.log(typeof empty); // object
객체 리터럴의 중괄호는 코드 블록을 의미하지 않는다.
코드 블록의 닫는 중괄호 뒤에는 세미콜론을 붙이지 않지만 객체 리터럴은 값으로 평가되므로 세미콜론을 붙여야 한다.
--> 객체를 숫자, 문자값 만들 듯이 편하게 생성할 수 있다.
객체 생성과 동시에 프로퍼티를 만들거나, 생성한 이후 프로퍼티를 동적으로 추가할 수도 있다.
객체 리터를 외에는 전부 함수를 사용해 객체 생성.
var obj = {};
var key = 'hello';
obj[key] = 'world';
// var obj = { [key]: 'world' };
console.log(obj); // { hello: 'world' }
var person = {
name: 'Lee',
sayHello: function () {
console.log(`Hello! My name is ${this.name}.`);
}
};
console.log(person.name);
console.log(person['name']); // 반드시 '' 붙여야한다, 키 명이 네이밍 큐칙을 안지킬 경우 [] 접근법 사용
객체에 존재하지 않는 프로퍼티에 접근하면 undefined를 반환. ReferenceError가 아님..
var name = 'Lee', age = 34;
var person = { name, age }; // 프로퍼티 축약 표현
console.log(name); // Lee
문자열 또는 문자열로 타입 변환할 수 있는 값으로 평가되는 표현식을 사용해 프로퍼티 키를 동적으로 생성.
var prefix = 'prop'
var i = 0;
var obj = {};
// 계산된 프로퍼티 이름으로 프로퍼티 키 동적 생성
obj[prefix + '-' + ++i] = i;
obj[prefix + '-' + ++i] = i;
obj[prefix + '-' + ++i] = i;
console.log(obj); // { prop-1: 1, prop-2: 2, prop-3: 3 }
//ES6부터 가능 - 객체 리터럴 내부에서도 계산된 프로퍼티 이름으로 프로퍼티 키를 동적 생성 가능
const obj = {
[`${prefix}-${++i}`]: i,
[`${prefix}-${++i}`]: i,
[`${prefix}-${++i}`]: i,
}
console.log(obj); // { prop-1: 1, prop-2: 2, prop-3: 3 }