객체는 연관된 함수와 데이터를 담는 컨테이너
객체는 변수에 할당될 수 있다
let spaceship = {}; // spaceship is an empty object
객체에는 데이터가 순서 구분없이 담긴다
데이터는 키 - 값 을 짝으로 해서 정리된다
'키'는 '값'이 담긴 메모리의 위치를 가리키며, 변수명과 같은 역할을 한다 key = property name
키의 값으로는 모든 데이터 타입이 올 수 있고
함수와 다른 객체가 담길 수도 있다
프로퍼티를 검색하기 위해서는 dot operator (.) 를 사용한다
let spaceship = {
homePlanet: 'Earth',
color: 'silver'
};
spaceship.homePlanet; // Returns 'Earth',
spaceship.color; // Returns 'silver',
객체의 키값을 검색하기 위해서는 대괄호를 사용한다
object 는 mutable
객체에 키-밸류 를 추가하기 위해서는 아래와 같이 하면 된다
const 로 선언한 변수 자체를 수정할 수는 없지만
해당 객체 내에 property 를 추가하거나 수정할 수는 있다
delete opterator 로 객체의 property 를 삭제할 수 있다
const spaceship = {
'Fuel Type': 'Turbo Fuel',
homePlanet: 'Earth',
mission: 'Explore the universe'
};
delete spaceship.mission; // Removes the mission property
객체에 저장된 데이터가 '함수' 일 때 -> 그것을 '메소드' 라고 부른다
프로퍼티: 객체가 가지고 있는 특징
메소드: 객체가 하는 행동
메소드를 객체에 추가할 수 있다
1.
const alienShip = {
invade: function () {
console.log('Hello! We have come to dominate your planet. Instead of Earth, it shall be called New Xaculon.')
}
};
const alienShip = {
invade () {
console.log('Hello! We have come to dominate your planet. Instead of Earth, it shall be called New Xaculon.')
}
};
alienShip.invade(); // Prints 'Hello! We have come to dominate your planet. Instead of Earth, it shall be called New Xaculon.'
객체 안에 객체를 포함할 수 있다
const spaceship = {
telescope: {
yearBuilt: 2018,
model: '91031-XLT',
focalLength: 2032
},
crew: {
captain: {
name: 'Sandra',
degree: 'Computer Engineering',
encourageTeam() { console.log('We got this!') }
}
},
engine: {
model: 'Nimbus2000'
},
nanoelectronics: {
computer: {
terabytes: 100,
monitors: 'HD'
},
'back-up': {
battery: 'Lithium',
terabytes: 50
}
}
};
값을 불러오기 위해서 줄줄이 소세지처럼 연산자를 연결하면 된다
헷갈리지 않게 순서를 잘 생각해서 불러오기!
spaceship.nanoelectronics['back-up'].battery; // Returns 'Lithium'
객체는 레퍼런스(참조)로 전달된다
객체에 할당된 변수를 함수의 인자로 전달했을 때
컴퓨터는 객체를 가지고 있는 메모리 공간을 가리킴으로서
파라미터명을 해석한다
따라서 객체의 프로퍼티를 바꾸는 함수는
실제로는 객체를 영구적으로 바꾸게 된다
(객체가 const 변수로 할당되더라도)
*이해하기 어려워서 일단 넘어가기
배열에서는 인덱스를 이용해서 배열 내의 엘리먼트를 돌 수 있었는데
객체는 순서가 없기 때문에 iteration 이 불가
for...in 문을 이용해서 객체 내의 각 프로퍼티에 대해 코드블럭을 실행할 수 있다
this 키워드를 쓰면
객체 내의 프로퍼티를 이용해서
'객체 내에' 함수를 만들 수 있다
const goat = {
dietType: 'herbivore',
makeSound() {
console.log('baaa');
},
diet() {
console.log(this.dietType);
}
};
goat.diet();
this 를 쓸 때는 arrow function 을 쓰지 않는다
이유가 있지만 아직 이해 못했고,
궁금해졌을 때 다시 공부하기
_ <- underscore 을 이용해서 '이 object 를 수정하지마라' 고 노티가능
객체와 객체의 프로퍼티를 함부로 수정하는 것은 이상한 결과값을 낳을 수도 있다
const bankAccount = {
_amount: 1000
}
getter 는 객체 내부 프로퍼티를 리턴하는 메소드
프로퍼티의 값을 검색하는 것 외에도 기능이 있다
const person = {
_firstName: 'John',
_lastName: 'Doe',
get fullName() {
if (this._firstName && this._lastName){
return `${this._firstName} ${this._lastName}`;
} else {
return 'Missing a first name or a last name.';
}
}
}
// To call the getter method:
person.fullName; // 'John Doe'
객체 내에 존재하는 프로퍼티의 값을 재할당할 수 있는 메소드
const person = {
_age: 37,
set age(newAge){
if (typeof newAge === 'number'){
this._age = newAge;
} else {
console.log('You must assign a number to age');
}
}
};
person.age = 40;
console.log(person._age); // Logs: 40
person.age = '40'; // Logs: You must assign a number to age
person._age = 'forty-five'
console.log(person._age); // Prints forty-five
객체의 인스턴스를 많이 만들고 싶을 때 factory functions
const monsterFactory = (name, age, energySource, catchPhrase) => {
return {
name: name,
age: age,
energySource: energySource,
scare() {
console.log(catchPhrase);
}
}
};
const ghost = monsterFactory('Ghouly', 251, 'ectoplasm', 'BOO!');
ghost.scare(); // 'BOO!'
destructuring = property value shorthand
: 변수에 프로퍼티를 할당하는 shortcut
const monsterFactory = (name, age) => {
return {
name: name,
age: age
}
};
const monsterFactory = (name, age) => {
return {
name,
age
}
};
const vampire = {
name: 'Dracula',
residence: 'Transylvania',
preferences: {
day: 'stay inside',
night: 'satisfy appetite'
}
};
const residence = vampire.residence;
console.log(residence); // Prints 'Transylvania'
// destructured assignment
const { residence } = vampire;
console.log(residence); // Prints 'Transylvania'
// used in nested properties in an object
const { day } = vampire.preferences;
console.log(day); // Prints 'stay inside'
연습한 methods