function Person(name, age) {
this.name = name;
this.age = age;
}
//프로토타입 상속
//Person의 프로토타입에 새 메서드를 추가해서
//Person 객체의 인스턴스들이 접근할 수 있도록 만듦
Person.prototype.greet = function() {
console.log(`Hello, my name is ${this.name}`)
}
const alberto = new Person("Alberto", 26);
const caroline = new Person("Caroline", 26);
alberto.greet();
caroline.greet();
// Hello, my name is Alberto
// Hello, my name is Caroline
클래스 선언 및 클래스 표현식은 호이스팅되지 않음
클래스에 접근하기 전에 클래스를 선언하지 않으면 ReferenceError가 발생함
생성자 메서드를 추가한 것을 제외하면 프로토타입 방식과 크게 차이가 없음
클래스는 프로토타입 방식을 대신하는 문법적 설탕(?)으로 봐도 됨
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet(){
console.log(`Hi, my name is ${this.name}
and I'm ${this.age} years old`)
}
farewell(){
console.log(`Goodbye friend`)
}
}
const alberto = new Person("Alberto", 26)
alberto.greet()
alberto.farewell()
앞서 작성한 greet()와 farewell()은 Person 클래스의 모든 인스턴스에서 접근할 수 있지만 Array.of()처럼 클래스의 인스턴스가 아닌 클래스 자체에서 접근할 수 있는 정적 메서드는 아래와 같이 정의할 수 있다.
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
static info() {
console.log("I am a Person class, nice to meet you")
}
}
const alberto = new Person("Alberto", 26)
alberto.info()
// TypeError
Person.info()
// I am a Person class, nice to meet you
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
this.nickname = "";
}
set nicknames(value){
this.nickname = value;
console.log(this.nickname)
}
get nicknames(){
console.log(`Your nickname is ${this.nickname}`)
}
}
const alberto = new Person("Alberto", 26)
// setter와 getter의 변수명이 같음.
// 호출하는 방법이 다름
// setter
alberto.nicknames = "Albi"
// Albi
// getter
alberto.nicknames
// Your nickname is Albi
extends 키워드를 사용하면 부모 클래스의 모든 속성과 메서드를 상속받을 수 있음
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet(){
console.log(`Hi, my name is ${this.name}
and I'm ${this.age} years old`)
}
}
class Adult extends Person {
constructor(name,age,work){
super(name,age)
// super 안쓰고 그대로 this.name, this.age 할 경우 ReferenceError
// -> 새로운 클래스에서 this를 사용하기 전에 super()를 호출해라
// -> Adult를 만들기에 앞서 Person을 만들어야 한다는 뜻
// 생성자 내부에서 super()를 호출하면 Person이 만들어짐
// (Person을 다시 선언하고 초기화할 필요가 없음)
this.work=work
}
}
const alberto = new Adult("Alberto", 26,"software developer")
console.log(alberto.age)
// 26
console.log(alberto.work)
// software developer
alberto.greet()
// Hi, my name is Alberto and I'm 26 years old
배열과 비슷하게 생겼지만 첫번째 값은 교실 이름이고,
나머지 값은 학생 이름과 점수를 나타내는 Classroom 이라는 새로운 클래스를 만들어보자
→ 배열을 상속받아서 !! 만들 수 있음
class Classroom extends Array {
constructor (name, ...students){
// 가변 인수로 입력받은 학생들 정보를
// 레스트 연산자를 이용해 배열 형태로 students에 할당
super(...students)
//스프레드 연산자로 배열 원소들을 다시 풀어헤쳐 생성자 호출
this.name = name
}
add(student){
this.push(student)
}
}
const myClass = new Classroom ('1A',
{name:"Tim", mark:6},
{name:"Tom", mark:3},
{name:"Jim", mark:8},
{name:"Kim", mark:1},
)
myClass.add({name:"lia", mark:7})
console.log(myClass[4])
// {name:"lia", mark:7}
for(const student of myClass){
console.log(student)
// { name: 'Tim', mark: 6 }
// { name: 'Tom', mark: 3 }
// { name: 'Jim', mark: 8 }
// { name: 'Kim', mark: 1 }
// { name: 'lia', mark: 7 }
}