Language/JavaScript

πŸ“š μžλ°”μŠ€ν¬λ¦½νŠΈ 클래슀 문법 - μ™„λ²½ κ°€μ΄λ“œ

인파_ 2022. 7. 18. 13:15

js-es6-class
js-es6-class

ES6 클래슀 문법은 쒀더 JAVA슀럽게 객체 지ν–₯적으둜 ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μΆ”κ°€λœ μƒˆλ‘œμš΄ 문법이닀.

ES5κΉŒμ§€ μžλ°”μŠ€ν¬λ¦½νŠΈμ—λŠ” ν΄λž˜μŠ€κ°€ μ—†μ—ˆλ‹€. κ·Έλž˜μ„œ ν”„λ‘œν† νƒ€μž… 체이닝을 톡해 클래슀 λΉ„μŠ€λ¬΄λ¦¬ν•˜κ²Œ κ΅¬ν˜„ν•΄μ™”μ—ˆλŠ”λ° ES6 버젼에 λ“€μ–΄μ„œλ©΄μ„œ ν΄λž˜μŠ€μ™€ λΉ„μŠ·ν•œ ꡬ쑰 문법을 μΆ”κ°€ν•˜μ˜€λ‹€.

λ‹€λ§Œ μƒκΉ€μƒˆλ§Œ 클래슀 ꡬ쑰이지, 엔진 λ‚΄λΆ€μ μœΌλ‘œλŠ” ν”„λ‘œν† νƒ€μž… λ°©μ‹μœΌλ‘œ μž‘λ™λœλ‹€.

 

λ‹€μŒμ€ ν”„λ‘œν† νƒ€μž… 문법과 클래슀 λ¬Έλ²•μ˜ κ°„λ‹¨ν•œ 차이이닀.

이 λ‘˜μ€ 같은 κ²°κ³Όλ₯Ό 좜λ ₯ν•˜μ§€λ§Œ, 문법 μƒκΉ€μƒˆλ§Œ λ‹€λ₯΄κ³  λ‚΄λΆ€ λ‘œμ§μ€ μ™„μ „νžˆ 같은 κ΅¬μ‘°λΌλŠ” 점만 κΈ°μ–΅ν•˜λ©΄ λœλ‹€.

 

 ES5 ν”„λ‘œν† νƒ€μž… 문법 

// μƒμ„±μž
function Person({name, age}) {
   this.name = name;
   this.age = age;
}

Person.prototype.introduce = function() {
   return `μ•ˆλ…•ν•˜μ„Έμš”, 제 이름은 ${this.name}μž…λ‹ˆλ‹€.`;
};

const person = new Person({name: 'μœ€μ•„μ€€', age: 19});
console.log(person.introduce()); // μ•ˆλ…•ν•˜μ„Έμš”, 제 이름은 μœ€μ•„μ€€μž…λ‹ˆλ‹€.

​

 ES6 클래슀 문법 

// 클래슀
class Person {
   // μ΄μ „μ—μ„œ μ‚¬μš©ν•˜λ˜ μƒμ„±μž ν•¨μˆ˜λŠ” 클래슀 μ•ˆμ— `constructor`λΌλŠ” μ΄λ¦„μœΌλ‘œ μ •μ˜ν•©λ‹ˆλ‹€.
   constructor({name, age}) { //μƒμ„±μž
     this.name = name;
     this.age = age;
   }
   // κ°μ²΄μ—μ„œ λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•  λ•Œ μ‚¬μš©ν•˜λ˜ 문법을 κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λ©΄, λ©”μ†Œλ“œκ°€ μžλ™μœΌλ‘œ `Person.prototype`에 μ €μž₯λ©λ‹ˆλ‹€.
   introduce() {
     return `μ•ˆλ…•ν•˜μ„Έμš”, 제 이름은 ${this.name}μž…λ‹ˆλ‹€.`;
   }
}

const person = new Person({name: 'μœ€μ•„μ€€', age: 19});
console.log(person.introduce()); // μ•ˆλ…•ν•˜μ„Έμš”, 제 이름은 μœ€μ•„μ€€μž…λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ 클래슀 문법

 

Class μ„ μ–Έ

constructorλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  클래슀 ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™”ν•˜κΈ° μœ„ν•œ νŠΉμˆ˜ν•œ λ©”μ„œλ“œμ΄λ‹€.
constructorλŠ” 클래슀 μ•ˆμ— ν•œ 개만 μ‘΄μž¬ν•  수 μžˆλ‹€. 2개 이상 μžˆμ„ 경우 Syntax Errorκ°€ λ°œμƒν•˜λ‹ˆκΉŒ μ£Όμ˜ν•˜μž.

class Person {
   height = 180; // μΈμŠ€ν„΄μŠ€ λ³€μˆ˜

   // constructorλŠ” 이름을 λ°”κΏ€ 수 μ—†λ‹€.
   constructor(name, age) {
      // thisλŠ” ν΄λž˜μŠ€κ°€ 생성할 μΈμŠ€ν„΄μŠ€λ₯Ό 가리킨닀.
      this.name = name;
      this.age = age;
   }
}

let person1 = new Person('john', 23);
console.log(person1.name); // john
console.log(person1.age); // 23
console.log(person1.height); // 180

클래슀 ν•„λ“œμ˜ μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™”λŠ” λ°˜λ“œμ‹œ constructor λ‚΄λΆ€μ—μ„œ μ‹€μ‹œν•œλ‹€.
constructor λ‚΄λΆ€μ— μ„ μ–Έν•œ 클래슀 ν•„λ“œλŠ” ν΄λž˜μŠ€κ°€ 생성할 μΈμŠ€ν„΄μŠ€μ— 바인딩 λœλ‹€.

클래슀 ν•„λ“œλŠ” κ·Έ μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œνΌν‹°κ°€ 되며, μΈμŠ€ν„΄μŠ€λ₯Ό 톡해 클래슀 μ™ΈλΆ€μ—μ„œ μ–Έμ œλ‚˜ μ°Έμ‘°ν•  수 μžˆλ‹€. (public)

 

JAVAλ‚˜ Python의 ν΄λž˜μŠ€λ¬Έλ²•κ³Όμ˜ 차이점은, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 클래슀 문법에선 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό λ°˜λ“œμ‹œ μ§€μ •ν•˜μ§€ μ•Šκ³  μƒμ„±μž(constructor)을 톡해 this.λ³€μˆ˜ λ¬Έλ²•μœΌλ‘œ μžλ™ μƒμ„±λ μˆ˜ μžˆλ‹€λŠ” 점이닀.

클래슀의 λ³Έλ¬Έ(body)은 strict modeμ—μ„œ μ‹€ν–‰λœλ‹€. μ„±λŠ₯ ν–₯상을 μœ„ν•΄ 더 μ—„κ²©ν•œ 문법이 μ μš©λœλ‹€.

Class λ©”μ†Œλ“œ μ •μ˜

β€‹ν΄λž˜μŠ€μ˜ λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•  λ•ŒλŠ” 객체 λ¦¬ν„°λŸ΄μ—μ„œ μ‚¬μš©ν•˜λ˜ 문법과 μœ μ‚¬ν•œ 문법을 μ‚¬μš©ν•œλ‹€.

class Calculator {
   add(x, y) {
     return x + y;
   }
   subtract(x, y) {
     return x - y;
   }
 }
 
 let calc = new Calculator();
 calc.add(1,10); // 11

​

객체 λ¦¬ν„°λŸ΄μ˜ 문법과 λ§ˆμ°¬κ°€μ§€λ‘œ, μž„μ˜μ˜ ν‘œν˜„μ‹μ„ λŒ€κ΄„ν˜Έλ‘œ λ‘˜λŸ¬μ‹Έμ„œ λ©”μ†Œλ“œμ˜ μ΄λ¦„μœΌλ‘œ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.

const methodName = 'introduce'; // 클래슀 λ©”μ†Œλ“œ 이름

class Person {
  constructor({name, age}) {
    this.name = name;
    this.age = age;
  }
  
  // μ•„λž˜ λ©”μ†Œλ“œμ˜ 이름은 `introduce`κ°€ λ©λ‹ˆλ‹€.
  [methodName]() {
    return `μ•ˆλ…•ν•˜μ„Έμš”, 제 이름은 ${this.name}μž…λ‹ˆλ‹€.`;
  }
}

console.log(new Person({name: 'μœ€μ•„μ€€', age: 19}).introduce()); // μ•ˆλ…•ν•˜μ„Έμš”, 제 이름은 μœ€μ•„μ€€μž…λ‹ˆλ‹€.

​

Getter / Setter

클래슀 λ‚΄μ—μ„œ Getter ν˜Ήμ€ setterλ₯Ό μ •μ˜ν•˜κ³  싢을 λ•ŒλŠ” λ©”μ†Œλ“œ 이름 μ•žμ— get λ˜λŠ” set을 λΆ™μ—¬μ£Όλ©΄ λœλ‹€.

 

[JS] πŸ“š μžλ°”μŠ€ν¬λ¦½νŠΈ Getter & Setter κ°œλ… 정리

ν”„λ‘œνΌν‹° getter와 setter 객체의 ν”„λ‘œνΌν‹°λŠ” 두 μ’…λ₯˜λ‘œ λ‚˜λ‰©λ‹ˆλ‹€. 첫 번째 μ’…λ₯˜λŠ” λ°μ΄ν„° ν”„λ‘œνΌν‹°(data property) μž…λ‹ˆλ‹€. μ§€κΈˆκΉŒμ§€ μ‚¬μš©ν•œ λͺ¨λ“  ν”„λ‘œνΌν‹°λŠ” 데이터 ν”„λ‘œνΌν‹°μž…λ‹ˆλ‹€. 두 λ²ˆμ§ΈλŠ” μ ‘κ·Ό

inpa.tistory.com

class Account {
  constructor() {
    this._balance = 0;
  }
  get balance() {
    return this._balance;
  }
  set balance(newBalance) {
    this._balance = newBalance;
  }
}

const account = new Account();
account.balance = 10000;
account.balance; // 10000

​

정적 λ©”μ„œλ“œ (static)

정적 λ©”μ„œλ“œλŠ” 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹Œ ν΄λž˜μŠ€ μ΄λ¦„μœΌλ‘œ κ³§λ°”λ‘œ ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œμ΄λ‹€.

static ν‚€μ›Œλ“œλ₯Ό λ©”μ†Œλ“œ 이름 μ•žμ— λΆ™μ—¬μ£Όλ©΄ ν•΄λ‹Ή λ©”μ†Œλ“œλŠ” μ •μ  λ©”μ†Œλ“œκ°€ λœλ‹€.

μš°λ¦¬κ°€ λžœλ€κ°’μ„ μ–»κΈ° μœ„ν•΄ Math.random() 같은 λ©”μ„œλ“œλ₯Ό 쓰듯이, λ”°λ‘œ new Math() 없이 κ³§λ°”λ‘œ 클래슀λͺ….λ©”μ„œλ“œλͺ… 으둜 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ„œ μ‚¬μš©ν•˜λŠ” 것이 λ°”λ‘œ radom λ©”μ†Œλ“œκ°€ static으둜 μ„€μ •λ˜μ–΄ 있기 λ•Œλ¬Έμ΄λ‹€.

class Person {
   constructor({ name, age }) { // μƒμ„±μž μΈμŠ€ν„΄μŠ€
      this.name = name;
      this.age = age;
   }
   static static_name = 'STATIC'; // 정적 μΈμŠ€ν„΄μŠ€

   getName() { // μΈμŠ€ν„΄μŠ€(ν”„λ‘œν† νƒ€μž…) λ©”μ†Œλ“œ
      return this.name;
   }
   static static_getName() { // 정적 λ©”μ†Œλ“œ
      return this.static_name;
   }
}

const person = new Person({ name: 'jeff', age: 20 });
person.getName(); // jeff
Person.static_getName(); // STATIC
class Person {
   constructor({ name, age }) {
      this.name = name;
      this.age = age;
   }
   // 이 λ©”μ†Œλ“œλŠ” 정적 λ©”μ†Œλ“œ
   static static_sumAge(...people) {
      /*
         ν•¨μˆ˜ νŒŒλΌλ―Έν„° peopleλ₯Ό μ „κ°œμ—°μ‚°μž ...peopleλ₯Ό 톡해 λ°°μ—΄λ‘œ λ§Œλ“¬
         [ {"name": "μœ€μ•„μ€€", age": 19}, { "name": "μ‹ ν•˜κ²½","age": 20 }]   
      */

      // 그리고 각 객체의 age값을 얻어와 ν•©μΉ¨
      return people.reduce((acc, person) => acc + person.age, 0);
   }
}

const person1 = new Person({ name: 'μœ€μ•„μ€€', age: 19 });
const person2 = new Person({ name: 'μ‹ ν•˜κ²½', age: 20 });

Person.static_sumAge(person1, person2); // 39

​

μ œλ„ˆλ ˆμ΄ν„°

Generator λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•˜λ €λ©΄, λ©”μ†Œλ“œ 이름 μ•žμ— * 기호λ₯Ό λΆ™μ—¬μ£Όλ©΄ λœλ‹€.

 

[JS] πŸ“š μ œλ„ˆλ ˆμ΄ν„° - μ΄ν„°λ ˆμ΄ν„° κ°•ν™”νŒ

μ œλ„€λ ˆμ΄ν„°λž€? μ΄ν„°λŸ¬λΈ”μ΄λ©° λ™μ‹œμ— μ΄ν„°λ ˆμ΄ν„° = μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜ (asyncκ°€ Promiseλ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜λ“―μ΄, μ œλ„ˆλ ˆμ΄ν„°λŠ” μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜λ‹€.) ​ μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜

inpa.tistory.com

class Gen {
  *[Symbol.iterator]() {
    yield 1;
    yield 2;
    yield 3;
  }
}

// 1, 2, 3이 μ°¨λ‘€λŒ€λ‘œ 좜λ ₯λ©λ‹ˆλ‹€.
for (let n of new Gen()) {
  console.log(n);
}

클래슀 상속 (Class Inheritance)

β€‹ν΄λž˜μŠ€ 상속(class inheritance, subclassing) κΈ°λŠ₯을 톡해 ν•œ 클래슀의 κΈ°λŠ₯을 λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œ μž¬μ‚¬μš©ν•  수 μžˆλ‹€.

 

extends ν‚€μ›Œλ“œ

extends ν‚€μ›Œλ“œλŠ” 클래슀λ₯Ό λ‹€λ₯Έ 클래슀의 ν•˜μœ„ 클래슀둜 λ§Œλ“€κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.

class Parent {
  // ...
}

class Child extends Parent {
  // ...
}

μœ„ μ½”λ“œμ—μ„œ, extends ν‚€μ›Œλ“œλ₯Ό 톡해 Child ν΄λž˜μŠ€κ°€ Parent 클래슀λ₯Ό μƒμ†ν–ˆλ‹€.

이 관계λ₯Ό 보고 'λΆ€λͺ¨ 클래슀-μžμ‹ 클래슀 관계' ν˜Ήμ€ '슈퍼 클래슀(superclass)-μ„œλΈŒ 클래슀(subclass) 관계'라고 λ§ν•˜κΈ°λ„ ν•œλ‹€.

β€‹λ”°λΌμ„œ μ–΄λ–€ 클래슀 Aκ°€ λ‹€λ₯Έ 클래슀 Bλ₯Ό μƒμ†λ°›μœΌλ©΄, λ‹€μŒκ³Ό 같은 일듀이 κ°€λŠ₯해진닀.

  • μžμ‹ 클래슀 Aλ₯Ό 톡해 λΆ€λͺ¨ 클래슀 B의 정적 λ©”μ†Œλ“œμ™€ 정적 속성을 μ‚¬μš©ν•  수 μžˆλ‹€.
  • λΆ€λͺ¨ 클래슀 B의 μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œμ™€ μΈμŠ€ν„΄μŠ€ 속성을 μžμ‹ 클래슀 A의 μΈμŠ€ν„΄μŠ€μ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.
class Parent {
  static staticProp = 'staticProp';
  static staticMethod() {
    return 'I\'m a static method.';
  }
  instanceProp = 'instanceProp';
  instanceMethod() {
    return 'I\'m a instance method.';
  }
}

class Child extends Parent {}

// μƒμ†ν•˜λ©΄ λΆ€λͺ¨μ˜ staticμš”μ†Œλ“€μ„ μ‚¬μš© κ°€λŠ₯
console.log(Child.staticProp); // staticProp
console.log(Child.staticMethod()); // I'm a static method.

// μƒμ†ν•˜λ©΄ λΆ€λͺ¨μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš© κ°€λŠ₯
const c = new Child();
console.log(c.instanceProp); // instanceProp
console.log(c.instanceMethod()); // I'm a instance method.

 

super ν‚€μ›Œλ“œ

​super ν‚€μ›Œλ“œμ˜ λ™μž‘ 방식은 λ‹€μŒκ³Ό κ°™λ‹€.​

  1. μƒμ„±μž λ‚΄λΆ€μ—μ„œ superλ₯Ό ν•¨μˆ˜μ²˜λŸΌ ν˜ΈμΆœν•˜λ©΄, λΆ€λͺ¨ 클래슀의 μƒμ„±μžκ°€ 호좜
  2. 정적 λ©”μ†Œλ“œ λ‚΄λΆ€μ—μ„œλŠ” super.propκ³Ό 같이 μ¨μ„œ λΆ€λͺ¨ 클래슀의 prop 정적 속성에 μ ‘κ·Όν•  수 μžˆλ‹€.
  3. μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œ λ‚΄λΆ€μ—μ„œλŠ” super.propκ³Ό 같이 μ¨μ„œ λΆ€λͺ¨ 클래슀의 prop μΈμŠ€ν„΄μŠ€ 속성에 μ ‘κ·Όν•  수 μžˆλ‹€.
super(); // λΆ€λͺ¨ μƒμ„±μž
super.λ©”μ†Œλ“œλͺ… // μ ‘κ·Ό
class Person{
    constructor(name, first, second){
        this.name=name;
        this.first=first;
        this.second=second;
    }

    sum(){
        return (this.first + this.second);
    }
} 

class Person2 extends Person{
	// override Person
    constructor(name, first, second, third){
        super(name, first, second); //λΆ€λͺ¨ μƒμ„±μžλ₯Ό κ°€μ Έμ™€μ„œ ν–‰ν•˜κ²Œ ν•œλ‹€.
        this.third = third;
    }
    
    sum(){
    	// λΆ€λͺ¨ λ©”μ†Œλ“œλ₯Ό κ°€μ Έμ™€μ„œ μ‚¬μš©.
        // μ˜€λ²„λ‘œλ”© λ©”μ†Œλ“œμ—μ„œ μ˜¨μ „ν•œ λΆ€λͺ¨ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜κ³  μ‹Άμ„λ•Œ
        return super.sum() + this.third; 
    }
}

var kim = new Person2('kim', 10, 20, 30);
document.write(kim.sum()); // 60

Private 클래슀 λ³€μˆ˜

μ΄μ „κΉŒμ§€ μžλ°”μŠ€ν¬λ¦½νŠΈ 클래슀의 λͺ¨λ“  λ©”μ„œλ“œλŠ” νΌλΈ”λ¦­μœΌλ‘œ μ§€μ •λ˜μ—ˆλ‹€.

κ·Έλž˜μ„œ 유λͺ…λ¬΄μ‹€ν•œ 반μͺ½μ§œλ¦¬ 클래슀 κ΅¬ν˜„μ²΄λ‘œ λΉ„λ‚œμ„ λ°›μ•„μ™”μ§€λ§Œ, ES2021λΆ€ν„°λŠ” λ©”μ„œλ“œμ™€ ν•„λ“œλͺ… μ•žμ— "#"을 λΆ™μ—¬μ„œ 프라이빗 λ©”μ„œλ“œμ™€ ν•„λ“œ μ •μ˜κ°€ κ°€λŠ₯ν•΄μ‘Œλ‹€. (보닀 JAVA μŠ€λŸ¬μ›Œμ‘Œλ‹€)

# κΈ°ν˜Έλ₯Ό μ ‘λ‘μ‚¬λ‘œ μ‚¬μš©ν•˜μ—¬ λ©”μ„œλ“œμ™€ μ ‘κ·Όμžλ₯Ό λΉ„κ³΅κ°œλ‘œ μ„€μ •ν•  수 있으며 λ™μ‹œμ— getter 및 setter λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.

class myClass {
	// private λ³€μˆ˜
    #num = 100
    
    // private λ©”μ„œλ“œ
    #privMethod(){
        console.log(this.#num); // 프라이빗 λ³€μˆ˜ 호좜
    }
    
    publicMethod() {
        this.#privMethod(); // 프라이빗 λ©”μ†Œλ“œ 호좜
    }    
}
 
let newClass = new myClass();
newClass.publicMethod() // 100

 

Private Fields μ²΄ν¬ν•˜κΈ°

private λ³€μˆ˜λ₯Ό ν΄λž˜μŠ€μ— μΆ”κ°€ν•˜λŠ” 것 κΉŒμ§€λŠ” μ’‹μ•˜μ§€λ§Œ, 클래슀λ₯Ό μ΄μš©ν• λ•Œ, 이 클래슀 μΈμŠ€ν„΄μŠ€κ°€ private인지 public인지 확인이 μ–΄λ €μš΄ κ²½μš°κ°€ μžˆμ—ˆλ‹€.

μ™œλƒν•˜λ©΄ public ν•„λ“œμ— λŒ€ν•΄ 클래슀의 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν•„λ“œμ— 접근을 μ‹œλ„ν•˜λ©΄ undefinedκ°€ λ°˜ν™˜λ˜λŠ” λ°˜λ©΄μ—, private ν•„λ“œλŠ” undefinedλŒ€μ‹  μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€κ²Œ 되기 λ•Œλ¬Έμ΄λ‹€. κ·Έλž˜μ„œ νŠΉμ • 객체에 μ–΄λ–€ private ν”„λ‘œνΌν‹°κ°€ μžˆλŠ”μ§€ ν™•μΈν•˜κΈ° μ–΄λ €μ› λ‹€.

λ”°λΌμ„œ in ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ 이 κ°μ²΄μ•ˆμ— private 속성/λ©”μ†Œλ“œ κ°€ μžˆλŠ”μ§€λ₯Ό 체크할 수 μžˆλ‹€.

class Foo {
   #brand = 100;
   static isFoo(obj) {
      return #brand in obj;
   }
}

const foo = new Foo();
const foo2 = { brand: 100 };
console.log('foo : ', Foo.isFoo(foo)); // true
console.log('foo2 : ', Foo.isFoo(foo2)); // false

클래슀 상속 & ν”„λ‘œν† νƒ€μž… 상속 문법 비ꡐ

β€‹ν΄λž˜μŠ€ 상속은 λ‚΄λΆ€μ μœΌλ‘œ ν”„λ‘œν† νƒ€μž… 상속 κΈ°λŠ₯을 ν™œμš©ν•˜κ³  μžˆλ‹€.

μ•„λž˜ μ½”λ“œμ˜ 클래슀 상속에 λŒ€ν•œ ν”„λ‘œν† νƒ€μž… 체인을 그림으둜 λ‚˜νƒ€λ‚΄λ³΄λ©΄ λ‹€μŒκ³Ό 같이 λœλ‹€.

class Person {}
class Student extends Person {}
const student = new Student();

js-es6-class


ν”„λ‘œν† νƒ€μž… 상속 방식

//ν”„λ‘œν† νƒ€μž… 방식
function Person(name, first, second){
    this.name=name;
    this.first=first;
    this.second=second;
}

Person.prototype.sum = function() {
    return (this.first + this.second);
}

function Student(name, first, second, third){
    Person.call(this, name, first, second); 
    //Person은 μƒμ„±μž ν•¨μˆ˜μ΄λ‹€. κ·Έλƒ₯ μ“°λ©΄ thisλŠ” 뭔데? κ·Έλž˜μ„œ μ΄λ•Œ call,bindν•¨μˆ˜λ₯Ό 써쀀닀.
    //클래슀의 super() 와 같은 역할을 ν•œλ‹€κ³  보면 λœλ‹€. ν•˜μ§€λ§Œ 아직 상속이 된건 μ•„λ‹ˆλ‹€.
    this.third = third;
}

//방법 1 λΉ„ν‘œμ€€ : 
//Student ν”„λ‘œν† νƒ€μž… 였브젝트 링크λ₯Ό Person ν”„λ‘œν† νƒ€μž… 였브젝트둜 μ—°κ²°μ‹œμΌœ sum을 μ‚¬μš©ν• μˆ˜μžˆκ²Œ 찾아가도둝 μ„€μ •
Student.prototype.__proto__ = Person.prototype;

//방법 2 ν‘œμ€€ :
//Personν”„λ‘œν† νƒ€μž… 였브젝트λ₯Ό μƒˆλ‘œ λ§Œλ“€μ–΄μ„œ λŒ€μž…
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student; //μƒμ„±μž μ—°κ²°


Student.prototype.avg = function(){
    return (this.first+this.second+this.third)/3;
}

var kim = new Student('kim', 10, 20, 30);

 

클래슀 상속 방식

//클래슀 방식
class Person{

    constructor(name, first, second){
        this.name=name;
        this.first=first;
        this.second=second;
    }

    sum(){
        return (this.first + this.second);
    }
} 

class Student extends Person{
    constructor(name, first, second, third){
        super(name, first, second);
        this.third = third;
    }
    
    sum(){
        return super.sum() + this.third;
    }
    avg(){
        return (this.first+this.second+this.third)/3;
    }
}

var kim = new Student('kim', 10, 20, 30);

 

​