- 원시 타입(Primitives)을 제외한 나머지 값들(함수, 배열, 정규표현식 등)은 모두 객체이다.
var person = {
name: 'Lee', -> 프로퍼티
sayHello: function () { -> 메소드
console.log('Hi! My name is ' + this.name);
}
};
📌 객체는 데이터(프로퍼티)와 그 데이터에 관련되는 동작(메소드)을 모두 포함할 수 있기 때문에 데이터와 동작을 하나의 단위로 구조화할 수 있어 유용하다.
//{} 내에 아무것도 기술하지 않으면 빈 객체가 생성된다.
var emptyObject = {};
console.log(typeof emptyObject); // object
//{} 내에 1개 이상의 프로퍼티를 기술하면 해당 프로퍼티가 추가된 객체를 생성할 수 있다.
var person = {
name: 'Lee',
gender: 'male',
sayHello: function () {
console.log('Hi! My name is ' + this.name);
}
};
console.log(person); // {name: "Lee", gender: "male", sayHello: ƒ}
;
을 붙이지 않는다. var person = {
name: 'Lee',
gender: 'male',
sayHello: function () {
console.log('Hi! My name is ' + this.name);
}
};
person = {
name: 'Lee',
gender: 'male',
sayHello: function () {
console.log('Hi! My name is ' + this.name);
}
};
// 빈 객체의 생성
var person = new Object();
// 프로퍼티 추가
person.name = 'Ssong';
person.gender = 'female';
person.sayHello = function () {
console.log('Hi! My name is ' + this.name);
};
console.log(typeof person); // object
console.log(person); // {name: "Ssong", gender: "female", sayHello: ƒ}
📌객체 리터럴 방식은 사실 JS가 내부적으로 Object 생성자를 이용해 객체를 만드는 것과 같다.
// 생성자 함수
function Person(name, gender) {
this.name = name;
this.gender = gender;
this.sayHello = function(){
console.log('Hi! My name is ' + this.name);
};
}
// 인스턴스의 생성
var person1 = new Person('Lee', 'male');
var person2 = new Person('Kim', 'female');
- 프로퍼티는 프로퍼티 키(이름)와 프로퍼티 값으로 구성된다.
var person = { name: 'Ssong', //key는 name, value는 'Lee' gender: 'female', //프로퍼티 나열은 `,`로 구분 age: '24', }
- 프로퍼티 값이 함수일 경우, 일반 함수와 구분하기 위해 메소드(method) 라 부른다. 즉, 메소드는 객체에 제한되어 있는 함수를 의미한다.
var circle = { radius: 5, -> 프로퍼티 getDiameter: function () { -> 메소드, getDiameter() 만 메소드이다. return 2 * this.radius; } };
var person = {
firstName: 'Ssong', //네이밍 규칙을 따랐음
'last-name': 'Jin', //네이밍 규칙을 따르지 않았음. -> ❌따옴표를 생략하면 - 연산자가 있는 표현식으로 해석할 위험이 있음!
}
[]
로 묶어야 한다. var person = {};
var key = 'name';
person[key]: 'Ssong';
console.log(person) // { name : 'Ssong'}
❌ var, function같은 예약어를 사용해도 에러는 발생하지 않지만 예상치 못한 에러가 발생할 수도 있으니 사용하지 않는 게 좋다.
❗ 이미 존재하는 키를 중복 선언하면 나중에 선언한 프로퍼티가 덮어쓴다.
var person = {
name: 'Lee',
name: 'Ssong',
}; // person = { name : 'Ssong' }
- 객체의 프로퍼티 값에 접근하는 방법은 마침표(.) 표기법과 대괄호([]) 표기법이 있다.
'acb'
에 마침표 표기법을 사용하면 JS엔진이 객체처럼 변화했다가 끝나면 다시 돌린다. 'abc'.length
//abc는 string. 원시 타입이지만 .을 사용하여 객체처럼 동작한다.
//'abc'의 길이를 알 수 있다.
var person = {
'first-name': 'Ssong',
gender: 'female',
1: 10
};
console.log(person['first-name']); // 'Ssong
console.log(person.gender); // 'female'
console.log(person['gender']); // 'female'
console.log(person['1']); // 10
console.log(person[1]); // 10 : person[1] -> person['1']
var person = {
name: 'Ssong',
}
console.log(person[name]); // ReferenceError: gender is not defined
var person = {
name: 'Ssong',
}
console.log(person['age']); // undefined
var person = {
name: 'Ssong',
};
person[name] = 'Kim'; // person.name = 'Kim'; 과 동일
console.log(person[name] ); // 'Kim'
var person = {
name: 'Ssong',
};
person.age = 24;
console.log(person[age] ); // '24'
var person = {
name: 'Ssong',
age: 24;
};
delete person.age; //age 프로퍼티 삭제
console.log(person); // {name: "Ssong"}
delete person.address //address라는 프로퍼티가 없지만 에러가 발생하지 않는다.
let x = 1, y = 2;
const obj = { x, y };
console.log(obj); // {x: 1, y: 2}
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}
const obj = {
name: 'Ssong',
//origin
sayHi: function(){
console.log('Hi! ' + this.name);
}
// 메서드 축약 표현
sayHi(){
console.log('Hi! ' + this.name);
}
};
obj.sayHi(); // Hi! Ssong
<모던 자바스크립트 deepdive와, 추가 탐구한 내용을 정리한 포스트입니다.>