객체 생성자
객체 생성자는 함수를 통해 새로운 객체를 만들고, 그 안에 넣고 싶은 값 혹은 함수들을 구현할 수 있게 해줌.
function Animal(type, name, sound) {
this.type = type;
this.name = name;
this.sound = sound;
this.say = function() {
console.log(this.sound);
};
}
const dog = new Animal('개', '멍멍이', '멍멍');
const cat = new Animal('고양이', '야옹이', '야옹');
dog.say();
cat.say();
객체 생성자를 사용 할 때는 보통 함수의 이름을 대문자로 시작하고, 새로운 객체를 만들 때에는 new키워드를 앞에 붙여줘야 함.
위 코드를 보면 dog가 가지고 있는 say함수와 cat이 가지고 있는 수행코드가 똑같지만 객체가 생성 될 때 마다 함수도 새로 만들어져 this.say로 설정됨.
같은 객체생성자 함수를 사용할 때, 특정 함수 또는 값을 재사용 할 수 있는데 이것이 프로토타입.
프로토타입
객체 생성자 함수 아래에 .prototype.[원하는키] = 코드를 입력하여 설정가능.
function Animal(type, name, sound) {
this.type = type;
this.name = name;
this.sound = sound;
}
Animal.prototype.say = function() {
console.log(this.sound);
};
Animal.prototype.sharedValue = 1;
const dog = new Animal('개', '멍멍이', '멍멍');
const cat = new Animal('고양이', '야옹이', '야옹');
dog.say();
cat.say();
console.log(dog.sharedValue);
console.log(cat.sharedValue);
객체 생성자 상속받기
Cat과 Dog라는 새로운 객체 생성자를 만들고, 해당 객체 생성자들에서 Animal의 기능을 재사용 한다면 아래와 같다.
function Animal(type, name, sound) {
this.type = type;
this.name = name;
this.sound = sound;
}
Animal.prototype.say = function() {
console.log(this.sound);
};
Animal.prototype.sharedValue = 1;
function Dog(name, sound) {
Animal.call(this, '개', name, sound);
}
Dog.prototype = Animal.prototype;
function Cat(name, sound) {
Animal.call(this, '고양이', name, sound);
}
Cat.prototype = Animal.prototype;
const dog = new Dog('멍멍이', '멍멍');
const cat = new Cat('야옹이', '야옹');
dog.say();
cat.say();
클래스
ES6 부터 추가된 문법으로 객체 생성자로 구현했던 코드를 조금 더 명확하고, 깔끔하게 구현 할 수 있게 해줌. 추가적으로 상속도 더욱 쉽게 할 수 있음
class Animal {
constructor(type, name, sound) {
this.type = type;
this.name = name;
this.sound = sound;
}
say() {
console.log(this.sound);
}
}
const dog = new Animal('개', '멍멍이', '멍멍');
const cat = new Animal('고양이', '야옹이', '야옹');
dog.say();
cat.say();
say 라는 함수를 클래스 내부에 선언하였는데, 클래스 내부의 함수를 '메서드'라고 부름.
이렇게 메서드를 만들면 자동으로 prototype 으로 등록이 됩니다.
또, class 를 사용했을때에는, 다른 클래스를 쉽게 상속 할 수 있습니다.
class Animal {
constructor(type, name, sound) {
this.type = type;
this.name = name;
this.sound = sound;
}
say() {
console.log(this.sound);
}
}
class Dog extends Animal {
constructor(name, sound) {
super('개', name, sound);
}
}
class Cat extends Animal {
constructor(name, sound) {
super('고양이', name, sound);
}
}
const dog = new Dog('멍멍이', '멍멍');
const cat = new Cat('야옹이', '야옹');
dog.say();
cat.say();
상속을 할 때에는 extends 키워드를 사용하며, constructor에서 사용하는 super() 함수가 상속받은 클래스의 생성자를 가르킵니다.
class Animal {
constructor(type, name, sound) {
this.type = type;
this.name = name;
this.sound = sound;
}
}
class Dog extends Animal {
constructor(name, sound) {
super('개', name, sound);
}
}
class Cat extends Animal {
constructor(name, sound) {
super('고양이', name, sound);
}
}
const dog = new Dog('멍멍이', '멍멍');
const dog2 = new Dog('왈왈이', '왈왈');
const cat = new Cat('야옹이', '야옹');
const cat2 = new Cat('냐옹이', '냐옹');
dog.say();
dog2.say();
cat.say();
cat2.say();
연습
class Food {
constructor(name) {
this.name = name;
this.brands = [];
}
addBrand(brand) {
this.brands.push(brand)
}
print() {
console.log(`${this.name}을/를 파는 음식점들:`)
console.log(this.brands.join(', '));
}
}
const pizza = new Food('피자');
pizza.addBrand('피자헛');
pizza.addBrand('도미노 피자');
const chicken = new Food('치킨');
chicken.addBrand('굽네치킨');
chicken.addBrand('BBQ');
pizza.print()
chicken.print();
출처 - 벨로퍼트와 함께하는 모던 자바스크립트
'반영훈 > 웹 개발' 카테고리의 다른 글
[JS]함수 스코프 개념 이해 (0) | 2020.08.13 |
---|---|
[JS] 익명함수(무명함수)와 즉시실행함수 (0) | 2020.08.13 |
[JS] 배열 내장함수 concat, join, reduce (0) | 2020.08.12 |
[JS] 배열 내장함수 filter, splice, slice (0) | 2020.08.12 |
[JS]배열 내장함수 indexOf, findIndex, find (0) | 2020.08.11 |
댓글