Class 클래스

minkyung·2022년 11월 22일
0
post-thumbnail

프로토타입 상속

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

클래스

클래스 생성 (constructor)

클래스 선언 및 클래스 표현식은 호이스팅되지 않음
클래스에 접근하기 전에 클래스를 선언하지 않으면 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()

정적 메서드 (static)

앞서 작성한 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

set와 get

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)

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

배열 확장하기 (Array 상속)

배열과 비슷하게 생겼지만 첫번째 값은 교실 이름이고,
나머지 값은 학생 이름과 점수를 나타내는 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 }
}
profile
프론트엔드 개발자

0개의 댓글