자바스크립트는 프로토타입 기반 객체 지향 언어
0개 이상의 프로퍼티로 구성된 집합
객체 지향 프로그래밍(Object Oriented Programming
객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임
가장 간단하고 일반적인 객체 생성 방법
객체 리터럴
Object 생성자 함수
생성자 함수
Object.create 메서드
클래스 (ES6)
리터럴(literal)
사람이 이해할 수 있는 문자 또는 약속된 기호를 사용하여 값을 생성하는 표기법
클래스에 의해 생성되어 메모리에 저장된 실체
인스턴스를 생성하기 위한 템플릿 역할
key와 value로 구성되는, 객체의 상태를 나타내는 값
빈 문자열을 포함하는 문자열 또는 심벌
자바스크립트에서 사용할 수 있는 모든 값
마침표 표기법 : 마침표 프로퍼티 접근 연산자(.)
대괄호 표기법 : 대괄호 프로퍼티 접근 연산자([키])
undefined
반환delete
연산자 사용
객체에 묶여 있는 함수
this
키워드는 객체 자신을 가리키는 참조 변수변수 이름과 프로퍼티 키가 동일할 때 프로퍼티 키 생략 가능
// ES6
let x = 1, y = 2;
const obj = { x, y };
// ES5
var x = 1, y = 2;
var obj = {
x: x,
y: y,
};
// ES6
const prefix = 'prop';
let i = 0;
// 객체 리터럴 내부에서 계산된 프로퍼티 이름으로 동적 생성
const obj = {
obj[`${prefix}-${++i}`]: i,
obj[`${prefix}-${++i}`]: i,
obj[`${prefix}-${++i}`]: i
};
// ES5
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 = {
name: 'Lee',
// 메서드 축약
sayHi() {
console.log('Hi! ' + this.name);
}
};
// ES5
var obj = {
name: 'Lee',
sayHi: function() {
console.log('Hi! ' + this.name);
}
};
obj.sayHi(); // Hi! Lee
원시 타입 값 | 객체 타입 값 | |
---|---|---|
변경 | 변경 불가능한 값(immutable value) | 변경 가능한 값(mutable value) |
할당 | 변수에 실제 값 저장 | 변수에 참조 값 저장 |
다른 변수에 할당 시 | 원본의 원시 값 복사(값에 의한 전달, pass by value) | 원본의 참조 값 복사(참조에 의한 전달, pass by reference) |
한번 생성된 원시 값은 읽기 전용 값으로서 변경할 수 없음 (불변성)
변수
하나의 값을 저장하기 위해 확보한 메모리 공간 자체, 혹은 그 메모리 공간을 식별하기 위해 붙인 이름
값
변수에 저장된 데이터로서, 표현식이 평가되어 생성된 결과
상수
재할당이 금지된 변수 (변경 불가능한 값과 다름)
원시 값을 할당한 변수에 새로운 원시 값을 재할당하면, 메모리 공간에 저장되어 있는 재할당 이전의 원시 값을 변경하는 것이 아니다. (원시 값은 변경 불가능한 값이므로) 새로운 메모리 공간을 확보하고 재할당한 원시 값을 저장한 후, 변수는 새롭게 재할당한 원시 값을 가리킨다. 이때 변수가 참조하던 메모리 공간의 주소가 바뀐다.
0개 이상의 문자로 이루어진 집합
유사 배열 객체
배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고, length 프로퍼티를 갖는 객체
for 문으로 순회도 가능
var str = 'string';
str[0] = 'S';
console.log(str); // string - 문자열은 원시 값이므로 변경 X
변수에 원시 값을 가지는 변수를 할당하면, 할당받는 변수에는 할당되는 변수의 원시 값이 복사되어 전달 (둘은 다른 메모리 공간에 저장된 별개 값)
식별자
메모리 주소에 붙인 이름
참조 값
생성된 객체가 저장된 메모리 공간 주소 그 자체
얕은 복사(shallow copy)
한 단계까지만 복사 (참조 값 복사)
깊은 복사(deep copy)
객체에 중첩되어 있는 객체까지 모두 복사 (원시 값처럼 완전한 복사본 생성)
// 얕은 복사
const o = { x: { y: 1 } };
const c1 = { ...o };
console.log(c1 === o); // false
console.log(c1.x === o.x); // true
객체를 가리키는 변수를 다른 변수에 할당하면, 원본의 참조 값이 복사되어 전달
값에 의한 전달과 참조에 의한 전달 모두 값을 복사해서 전달하는데, 변수에 저장된 값이 원시 값이냐 참조 값이냐에 차이가 있음