Modern JavaScript Deep Dive 스터디 - CH10 체 리터럴
참고 자료: ⟪모던 자바스크립트 Deep Dive⟫"(이웅모 지음,위키북스, 2020)
- 객체 리터럴
- object 생성자 함수
- 생성자 함수
- Object.create 메서드
- 클래스(ES6)
클래스 기반 객체지향 언어와는 달리 다양한 객체 생성 방법을 지원
var person = {
name: "Wi",
sayHello: function () {
console.log(`Hello My name is ${this.name}`);
},
};
객체는 프로퍼티의 집합
프로퍼티는 키
와 값
으로 구성
프로퍼티 키(key)
: 문자열(string) 또는 심벌(symbol) 값
프로퍼티 값(value)
: 자바스크립트에서 사용할 수 있는 모든 값
프로퍼티 키는 프로퍼티 값에 접근할 수 있는 이름으로서 식별자 역할 -> 식별자 네이밍 규칙 존재
-> 식별자 네이밍 규칙을 준수하는 프로퍼티 키는 따옴표 생략 가능, 식별자 네이밍 규칙을 따르지 않는 이름에는 반드시 따옴표를 사용
var person = {
firstName: "Ung-mo", // 규칙을 준수.
"last-name": "Lee", // 규칙을 준수하지 않음.
};
var person = {
firstName: "Ung-mo", // 규칙을 준수.
last-name: "Lee", // SyntaxError: Unexpected token -
};
[]
로 묶어야 함var foo = {
0: 1,
1: 2,
2: 3,
};
console.log(foo); // { '0': 1, '1': 2, '2': 3 } << 키값이 문자열 형태로 암묵적 타입 변환
var foo = {
name: "abc",
name: "def",
};
console.log(foo); // { name: 'def' }
,
사용. 맨 마지막 프로퍼티 끝에도 콤마,
넣어도 됨(나중에 코드 수정할 때 편하기 때문에 개인적으로 권장 -> prettier에 미리 적용해두면 좋음)var obj = {
a: 1,
b: 2,
c: 3,
}
.
이용[]
이용var person = {
"name": "Boo",
1: 10,
"last-name": "Lee",
};
// 1. 마침표 표기법
console.log(person.name); // "Boo"
// 2. 대괄호 표기법
console.log(person["name"]); // "Boo"
// ===== 주의사항 =====
// 환경에 따라 결과 다를 수 있음
person.'last-name'; // SyntaxError: Unexpected string
person.last-name;
// 브라우저: NaN,
// Node.js: ReferenceError: name is not defined
// 대괄호 표기법에서 문자열 키는 따옴표로 묶어야함
person[last-name]; // ReferenceError: last is not defined
person['last-name']; // "Lee"
person['name']; // Boo
person[name]; // undefined
// 대괄호 표기법에서 숫자 키는 따옴표 생략 가능
person[1]; // 10
person["1"]; // 10
// 마침표 표기법에서는 숫자키, 따옴표 사용 불가
person.1; // SyntaxError: Unexpected number
persn."1"; // SyntaxError: Unexpected string
delete
연산자로 객체의 프로퍼티를 삭제 가능delete
연산자의 피연산자는 프로퍼티 값에 접근할 수 있는 표현식var person = {
name: "Boo",
};
person.age = 25; // 프로퍼티 동적 생성
console.log(person); // { name: 'Boo', age: 25 }
delete person.age; // 프로퍼티 삭제
delete person.job; // 존재하지 않는 프로퍼티 삭제 -> 에러 발생 X
console.log(person); // { name: 'Boo' }
var person = {
// 프로퍼티
name: "WI",
// 메서드
sayHello: function () {
console.log(`Hello My name is ${this.name}`);
},
};
person.sayHello(); // Hello My name is WI
// ES6
let x = 1, y = 2;
// 프로퍼티 축약 표현
const obj = { x, y };
console.log(obj); // {x: 1, y: 2}
// ES5
var x = 1, y = 2;
var obj = {
x: x,
y: y
};
console.log(obj); // {x: 1, y: 2}
[]
로 묶어서 사용// ES6
const prefix = 'prop';
let i = 0;
// 객체 리터럴 내부에서 계산된 프로퍼티 이름으로 프로퍼티 키 동적 생성
const obj = {
[`${prefix}-${++i}`]: i,
[`${prefix}-${++i}`]: i,
[`${prefix}-${++i}`]: i
};
console.log(obj); // {prop-1: 1, prop-2: 2, prop-3: 3}
// ES5
// 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}
function
키워드를 생략한 메서드 정의 방식// ES6
const obj = {
name: 'Lee',
// 메서드 축약 표현
sayHi() {
console.log('Hi! ' + this.name);
}
};
obj.sayHi(); // Hi! Lee
// ES5
var obj = {
name: 'Lee',
sayHi: function() {
console.log('Hi! ' + this.name);
}
};
obj.sayHi(); // Hi! Lee
const obj = {
x: 1,
// foo는 메서드
foo() { return this.x; },
// bar에 바인딩된 함수는 메서드가 아닌 일반 함수
bar: function() { return this.x; }
};
// foo, bar 둘 다 callable
console.log(obj.foo()); // 1
console.log(obj.bar()); // 1
// foo는 prototype 프로퍼티가 없음
new obj.foo(); // -> TypeError: obj.foo is not a constructor
new obj.bar(); // -> bar {}