자바스크립트는
객체기반
의프로그래밍 언어
이다.
원시값
을 제외한 나머지 값 함수
, 배열
, 정규 표현식
등은 모두 객체
이다.
복합적인 자료구조
이다.키
와 값
으로 구성된다.프로퍼티
와 메서드
로 구성된 집합니다.프로퍼티
: 객체의 상태를 나타내는 값(data)
메서드
: 프로퍼티(상태 데이터)를 참조하고 조작할 수 있는 동작(behavior)
즉 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임을 객체지향 프로그래밍
이라 한다
자바스크립트는 프로토타입 기반 객체지향 언어로 다양한 객체 생성 방법
을 지원한다.
이 중 객체 리터럴
이 가장 일반적이고 간단한 객체 생성 방법이다.
다시 말하자면
자바스크립트는 객체 생성을 편하게 하기 위해 객체리터럴
을 지원한다.
const a 로 선언한 순간 a 라는 이름의 객체가 생성되는 것이다.
const a = {
hello = 'world'
}
리터럴
은 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용하여 값을 생성하는 표기법이다.
쉽게 표현하자면
리터럴은 변하지 않는 데이터를 뜻 한다.
"1" "hello" "1e+12" 같은 고정된 값을 리터럴이라고 하고 그들은 바뀔수 없다. 더이상 나누어질수 없는 직관적인 데이터를 생각하면 편할것이다.
var a = 1;
// 이 코드는 a라는 상자(메모리 위치)안에 1이라는 데이터(메모리 값)을 담고있다
//a를 우리는 변수라고 하고 1이라는 데이터를 리터럴이라고 한다.
즉, '객체 리터럴'은 객체를 생성하기 위한 표기법이다.
// 아래의 코드에서 {}부분이 객체 리터럴이다.
const student = {
name: 'Kim',
age:20
};
// 빈 객체
const empty = {};
console.log(typeof empty) // object
객체 리터럴 외의 객체 생성 방식은 모두 함수를 이용해 객체를 만든다. 이 부분은 함수를 알아본 이후에 공부하자.
객체는 프로퍼티의 집합이며, 프로퍼티는 키와 값으로 구성된다.
const person = {
// 프포러티 키는 name, 프로퍼티 값은 'Kim'
name: 'Kim',
// 프포러티 키는 age, 프로퍼티 값은 20
age: 20
}
프로퍼티 키
: 빈 문자열을 포함하는 모든 문자열 또는 심볼 값
프로퍼티 값
: 자바스크립트에서 사용할 수 있는 모든 값
식별자 역할
을 한다.const name = {
firstName : 'So-Hyoen', // 식별자 네이밍 규칙 준수하는 키
'last-name' : 'Kim'// 식별자 네이밍 규칙 준수하지 않는 키
//last-name: 'Kim' // SyntaxError: Unexpected token -
}
const obj = {};
const key = 'hello'
// ES5: 프로퍼티 키 동적 생성
obj[key] = 'world'
// 'world'
// ES6: 계산된 프로퍼티 이름
// const obj = {[key]: 'world'}
console.log(obj)
// {hello:'world'}
프로퍼티의 값이 함수일 경우 이를 일반 함수와 구분하기 위해 '메서드'라고 부른다.
즉, 메서드는 객체에 묶여 있는 함수
를 의미한다.
참고) 늘 메서드라고 부르는 것은 아닌 것 같다. 메서드로 쓸 수 있는 경우에만 즉 호출할 떄에 따라 다름.. by Youtube 모던 자바스크립트 딥다이브 스터디 #2-1 (CH10, 11)
프로퍼티에 접근하는 방법은 크게 두가지가 있다.
마침표 표기법
: 점(.) 연산자에 의한 접근
대괄호 표기법
: 대괄호[ ] 연산자에 의한 접근
const person = {
name: 'Kim'
}
// 마침표 표기법에 의한 접근
console.log(person.name); // Kim
// 대괄호 표기법에 의한 접근
console.log(person['name']); // Kim
const person = {
name:'Sohyeon'
};
console.log(person[name]); //ReferenceError: name is not defined
const obj = {};
console.log(obj.a) //undefined
obj.a = 'Hi'
console.log(obj.a) //Hi
이미 존재하는 프로퍼티에 값을 할당하면 갱신된다.
const person = {
name: 'Kim'
}
person.name = 'Lee'
console.log(person) // {name:'Lee'}
존재하지 않는 프로퍼티에 값을 할당하면 프로퍼티가 동적으로 생성되어 추가되고 값이 할당된다.
const person = {
name: 'Kim'
}
person.age = 20
console.log(person) // {name:'Lee', age:20}
delete 연산자를 사용하여 객체의 프로퍼티를 삭제한다.
const person = {
name: 'Kim',
age:20
}
delete person.age; // true
// 애초에 person 에 address 없음, 삭제 불가능 그런데 에러 발생 안함
delete person.address; // true 가 나옴 ...
console.log(person) // { name: 'Kim' }
const name = 'sohyeon'
const obj = {
name: name,
}
// 위 표현을 아래처럼 나타낼 수 있음
const name = 'sohyeon'
const obj = {
name,
}
대괄호 [ ] 를 사용하면 객체 리터럴 상에서 표현식의 평가값
을 키
로 사용할 수 있다.(본문)
객체 리터럴 안의 프로퍼티 키가 대괄호[ ]로 둘러싸여 있다면, 이를 계산된 프로퍼티
(computed property) 라고 부른다.
let a = 'age'
const person = {
name: 'Sohyeon',
[a] : 20
}
console.log(person) // { name: 'Sohyeon', age: 20 }
이 부분 어려워 ... 책이 더 어려워...
메서드의 축약 방법은 ES5
의 경우 메서드를 선언하려면 프로퍼티 값으로 함수
를 할당한다.
var obj = {
name: 'Kim',
// 값으로 함수 선언
sayHi: function(){
console.log('Hi!' + this.name)
}
};
obj.sayHi(); //Hi! Kim
반면 ES6
에서는 메서드를 정의할 때 function 키워드를 생략
한 축약 표현을 사용할 수 있다.
var obj = {
name: 'Kim',
sayHi(){
console.log('Hi!' + this.name)
}
};
obj.sayHi(); //Hi! Kim
축약이라고는 했지만 사실 ES5
의 경우와 후자로 선언한 ES6
의 경우 성격이 조금 다르다. 축약 표현에 경우 constructor(생성자)로 사용될 수 없는 등 차이점이 있다. 자세한 내용은 26장 '메서드'에서 다룬다.
모던 자바스크립트 Deep Dive
블로그에 작성한 파트 외 정리본은 깃헙에서 확인 가능합니다.