๐Ÿ“– [JavaScript] ํด๋ž˜์Šค(Class)

ํ˜ฑยท2022๋…„ 9์›” 10์ผ

JavaScript_Intermediate

๋ชฉ๋ก ๋ณด๊ธฐ
16/19

๐Ÿ“Œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜

๋น„์Šทํ•œ ๊ฐ์ฒด๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์—ฌ๋Ÿฌ๊ฐœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ์ƒ์„ฑ

const User = function(name, age){
  this.name = name;
  this.age = age;
  this.showName = funciton() {
    console.log(`hello, ${name}`)
  }
}
const mike = new User('Mike' , 30);

๐Ÿ“Œ ํด๋ž˜์Šค

class User2{
  constructor(name, age){
    this.name = name;
    this.age = age;
  }
  showName(){
    console.log(this.name)
  }
}

const tom = new User2('Tom', 19)

new๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ–ˆ์„ ๋•Œ ๋‚ด๋ถ€์—์„œ ์ •์˜๋œ ๋‚ด์šฉ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ƒ์„ฑ์žํ•จ์ˆ˜์™€ ๋™์ผ!
constructor: ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ƒ์„ฑ์ž ๋ฉ”์„ธ์ง€
๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ’์ด ์ •ํ•ด์ง€๊ณ , ์ธ์ˆ˜๋ฅผ ๋„˜๊ฒจ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
showName() ์€ User2์˜ prototype์— ์ €์žฅ๋จ

๋”ฐ๋ผ์„œ, mike๋Š” ๊ฐ์ฒด ๋‚ด๋ถ€์— showName,
tom์€ prototype์•ˆ์— showName์ด ์žˆ์Œ

โœ”๏ธ ์ฐจ์ด์ 

1.

*์ƒ์„ฑ์ž ํ•จ์ˆ˜
const User = function(name, age){
  this.name = name;
  this.age = age;
};

User.prototype.showName = funciton() {
    console.log(`hello, ${name}`)
  };

const mike = User('Mike' , 30); //new๋ฅผ ๋นผ๋ด„
mike // undefined
for(const p in mike) {
  console.log(p);
} //name age showName

*ํด๋ž˜์Šค
class User2{
  constructor(name, age){
    this.name = name;
    this.age = age;
  }
  showName(){
    console.log(this.name)
  }
}

const tom = User2('Tom', 19)
tom // ์—๋Ÿฌ
for(const p in tom) {
  console.log(p);
} //name age

โ˜‘๏ธ proto ์•ˆ์— ์žˆ๋Š” constructor์„ ๋ณด๋ฉด, User2 ์—๋Š” constructor๊ฐ€ class๋ผ๊ณ  ๋ช…์‹œ
constructor๊ฐ€ class๋ผ๋Š” ๊ฑธ ์•Œ๊ณ  ์žˆ๊ณ , ์ด ๊ฒฝ์šฐ์— new ์—†์ด ํ˜ธ์ถœํ•˜๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ

2.

*์ƒ์„ฑ์ž ํ•จ์ˆ˜
const User = function(name, age){
  this.name = name;
  this.age = age;
};

User.prototype.showName = funciton() {
    console.log(`hello, ${name}`)
  };

const mike = new User('Mike' , 30); 

for(const p in mike) {
  console.log(p);
} //name age showName

*ํด๋ž˜์Šค
class User2{
  constructor(name, age){
    this.name = name;
    this.age = age;
  }
  showName(){
    console.log(this.name)
  }
}

const tom = new User2('Tom', 19)

for(const p in tom) {
  console.log(p);
} //name age

โ˜‘๏ธ for in ๋ฌธ์€ propo ์•ˆ์— ์žˆ๋Š” property๋ฅผ ๋ชจ๋‘ ๋ณด์—ฌ์ฃผ๊ณ ,
๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” property๋งŒ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ hasOwnProperty๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์Œ
Class ๋ฉ”์†Œ๋“œ๋Š” for in ๋ฌธ์—์„œ ์ œ์™ธ!

โœ”๏ธ ์ƒ์†

extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉ!

class Car{
  constructor(color) {
    this.color = color;
    this.wheels=4;
  }
  drive() {
    console.log('drive...');
  }
  stop() {
    console.log('Stop!');
  }
}

class Bmw extends Car {
  park() {
    console.log('PARK!');
  }
}

const z4 = new Bmw('blue');

z4.drive(); //drive.. 
>์ผ๋‹จ z4 -> proto -> proto (Car)

โœ”๏ธ ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ

๋งŒ์•ฝ, Car, Bmw๊ฐ€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด...?

class Car{
  constructor(color) {
    this.color = color;
    this.wheels=4;
  }
  drive() {
    console.log('drive...');
  }
  stop() {
    console.log('Stop!');
  }
}

class Bmw extends Car {
  park() {
    console.log('PARK!');
  }
   stop() {
    console.log('OFF');
  }
}

const z4 = new Bmw('blue');

z4.stop(); //OFF 

๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋‚˜์˜ค๋ฉด ๋ฎ์–ด ์“ฐ๊ฒŒ ๋จ

โœ”๏ธ ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding)

๋ถ€๋ชจ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ด์„œ ํ™•์žฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด...?
supper๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋จ!
supper.method๋กœ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ •์˜๋œ ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ! => ์˜ค๋ฒ„๋ผ์ด๋”ฉ

class Car{
  constructor(color) {
    this.color = color;
    this.wheels=4;
  }
  drive() {
    console.log('drive...');
  }
  stop() {
    console.log('Stop!');
  }
}

class Bmw extends Car {
  park() {
    console.log('PARK!');
  }
   stop() {
     supper.stop();
    console.log('OFF');
  }
}

const z4 = new Bmw('blue');

z4.stop(); //Stop! OFF

โœ”๏ธ ์ƒ์„ฑ์ž ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Constructor Overriding)

class Car{
  constructor(color) {
    this.color = color;
    this.wheels=4;
  }
  drive() {
    console.log('drive...');
  }
  stop() {
    console.log('Stop!');
  }
}

class Bmw extends Car {
  constructor(){
    this.navigation = 1;
  }
  park() {
    console.log('PARK!');
  }
}

const z4 = new Bmw('blue')  //error ๋ฐœ์ƒ

โ˜‘๏ธ constructor์—์„œ this๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— super constructor, ์ฆ‰ ๋ถ€๋ชจ ์ƒ์„ฑ์ž๋ฅผ ๋ฐ˜๋“œ์‹œ ๋จผ์ € ํ˜ธ์ถœํ•ด์•ผ ํ•จ!
extends๋กœ ํ• ๋‹น๋œ ์ž์‹ class๋Š” ๋นˆ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  this๋ฅผ ํ• ๋‹นํ•˜๋Š” ์ž‘์—…์„ ๊ฑด๋„ˆ ๋œ€
๋”ฐ๋ผ์„œ ํ•ญ์ƒ superํ‚ค์›Œ๋“œ๋กœ ๋ถ€๋ชจ class์˜ constructor๋ฅผ ์ƒ์„ฑํ•ด์ค˜์•ผํ•จ!!

class Car{
  constructor(color) {
    this.color = color;
    this.wheels=4;
  }
  drive() {
    console.log('drive...');
  }
  stop() {
    console.log('Stop!');
  }
}

class Bmw extends Car {
  constructor(){
    super();
    this.navigation = 1;
  }
  park() {
    console.log('PARK!');
  }
}

const z4 = new Bmw('blue') 

โ˜‘๏ธ ์ž˜ ๋งŒ๋“ค์–ด์ง, ์ด ๋•Œ blue๋ฅผ ๋„ฃ์–ด์คฌ์–ด๋„ color๋Š” undefined,
์ž์‹ class์˜ constructor์— color๋ฅผ ๋ฐ›๊ณ  ๋„˜๊ฒจ์ฃผ๋Š” ์ž‘์—…์„ ํ•ด์•ผํ•จ
๋™์ผํ•œ ์ธ์ˆ˜๋ฅผ ๋ฐ›๋Š” ์ž‘์—…์ด ํ•„์š”

์ฆ‰,

class Bmw extends Car {
  constructor(color){
    super(color);
    this.navigation = 1;
  }
  park() {
    console.log('PARK!');
  }
}

๐Ÿค” ์ฒ˜์Œ์—๋Š” ์ธ์ˆ˜๋ฅผ ์•ˆ ๋„ฃ์—ˆ์–ด๋„ ์ž˜ ๋™์ž‘ํ–ˆ๋Š”๋ฐ ์™œ์ผ๊นŒ?

class Bmw extends Car {
  park() {
    console.log('PARK!');
  }

โ˜‘๏ธ ์ฒ˜์Œ, ์œ„ ์ฝ”๋“œ๊ฐ€ ์ž˜ ๋™์ž‘ํ•œ ์ด์œ :
constructor๊ฐ€ ์—†์œผ๋ฉด, ๊ทธ ๋ถ€๋ถ„์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ–‰๋™(...args)์ค„ ๋ณด๊ธฐ!

class Bmw extends Car {
  constructor(...args){
    super(...args);
  }
  park() {
    console.log('PARK!');
  }
}

const z4 = new Bmw('blue');

โญ๏ธ ์ž์‹ ์ƒ์„ฑ์ž๋Š” ๋ฌด์กฐ๊ฑด ๋ถ€๋ชจ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•จ! โญ๏ธ
์ž์‹ ์ƒ์„ฑ์ž์— constructor๊ฐ€ ์žˆ์œผ๋ฉด, ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์•„์„œ
super()๋ฅผ ์ด์šฉํ•ด์„œ ํ˜ธ์ถœํ•ด์ฃผ๊ณ  this.property๋ฅผ ์ด์šฉํ•ด์„œ ํ• ๋‹นํ•ด ์ค˜์•ผ ํ•จ
constructor์—์„œ color ๊ฐ’์„ ๋ฐ›์€ ํ›„ super๋กœ ๋„˜๊ฒจ ์ค˜์•ผ ์ž˜ ์ƒ์„ฑ๋จ.

profile
new blog: https://hae0-02ni.tistory.com/

0๊ฐœ์˜ ๋Œ“๊ธ€