
앞선 포스팅에서 데이터 타입은 원시타입과 객체타입 두 종류로 나뉘고, 객체타입은 원시타입의 집합이라고 했다. 이번 포스팅에서는 객체에 대해 알아보겠다.
객체는 key-value로 이루어진 property(속성)의 집합이다. 즉, key 와 value의 쌍으로 이루어진 container라고 생각하면 쉽다. 서로 연관있는 데이터와 속성을 묶어줄때 사용되고 여기서 데이터란 프로퍼티, 속성이란 메서드를 의미한다. 객체는 heap 이라고 하는 메모리 공간에 저장되기 때문에 동적으로 접근이 가능하다. 점표기법을 통해 속성이 동적으로 추가, 삭제된다.
const Obj = {
name: 'jay',
favoriteFood: '🌽',
};
console.log(Obj); // { name: 'jay', favoriteFood: '🌽'}
//속성 추가
Obj.cat = '🐈⬛';
console.log(Obj); // { name: 'jay', favoriteFood: '🌽', cat: '🐈⬛'}
//속성 삭제
delete Obj.cat;
console.log(Obj); // { name: 'jay', favoriteFood: '🌽'}
동적으로 접근할 수 있다. 단, 이때는 대괄호 표기법을 사용하여 접근하여야 한다.function getKey(Obj, key) {
return Obj[key];
}
console.log(getKey(Obj, 'name')); // 'jay'
console.log(getKey(Obj, 'favoriteFood')); // '🌽'
function addKey(Obj, key, value) {
Obj[key] = value;
return Obj;
}
console.log(addKey(Obj, 'age', 23)); // { name: 'jay', favoriteFood: '🌽' , age: 23}
function delKey(Obj, key) {
delete Obj[key];
return Obj;
}
console.log(delKey(Obj, 'age')); //{ name: 'jay', favoriteFood: '🌽' }
점표기법, 대괄호표기법으로 객체에 동적으로 접근할 수 있다는 것을 알게 되었다.
위의 예제 코드를 조금 더 간결하게 쓸 수 없을까? 함수를 사용해 여러 개의 객체를 만들어보자.
function createObj(name,favoriteFood,age){
return{
name, //name : name
favoriteFood, //favoriteFood : favoriteFood
age //age : age
};
}
console.log(creatObj('jay','🌽',23)) //{ name: 'jay', favoriteFood: '🌽', age: 23 }
console.log(creatObj('sheep','🍫',21)) //{ name: 'sheep', favoriteFood: '🍫', age: 21 }
객체리터럴에서만 유효하다.{} 를 사용해 객체를 만들고, property와 method를 정의한다.const fruit = {
name: 'apple',
display: function () {
console.log(`${this.name} : 🍎`);
},
};
console.log(fruit); //{ name: 'apple', display: [Function: display] }
fruit.display(); // apple : 🍎
const fruit = {
name: 'apple',
display: () => {
console.log(`${this.name} : 🍎`);
},
};
console.log(fruit); //{ name: 'apple', display: [Function: display] }
fruit.display(); // undefined : 🍎
function Fruit(name) {
this.name = name;
this.display = function () {
console.log(`${this.name} : 🍎`);
};
}
const apple = new Fruit('apple');
console.log(apple); //{ name: 'apple', display: [Function: display] }
apple.display(); // apple : 🍎
class 키워드를 사용하여 정의되고new 키워드와 함께 클래스를 사용하여 생성된다.new 키워드의 사용하여 클래스를 기반으로 생성한 새로운 객체가 메모리에 할당을 의미된다.class Fruit {
constructor(name) {
this.name = name;
}
display() {
console.log(`${this.name} : 🍎`);
}
}
const apple = new Fruit('apple');
console.log(apple); //{ name: 'apple', display: [Function: display] }
apple.display(); // apple : 🍎
extends와 super를 통한 클래스의 상속은 구문이 더 간결하고 이해하기 쉽다.오버라이딩을 포함한 수정과 확장이 클래스에서는 더 직관적으로 이루어진다.생성자 함수
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function () {
console.log(`${this.name} makes a noise.`);
};
function Dog(name) {
Animal.call(this, name);
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
Dog.prototype.speak = function () {
console.log(`${this.name} barks.`);
};
var dog = new Dog('Rex');
dog.speak(); // Rex barks.
생성자 함수에서는 Animal.call(this, name);과 Object.create(Animal.prototype);을 사용하여 상속을 구현한다.이 방식은 상대적으로 복잡하고, 상속 관계를 설정하기 위해 추가적인 코드가 필요하다.
클래스
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex');
dog.speak(); // Rex barks.
클래스에서는 extends 키워드와 super() 호출을 통해 상속을 구현한다. 이 방식은 보다 직관적이며, 상속 관계를 명확하게 표현한다.