Programming/Node.js

Javascript ์ดํ•ดํ•˜๊ธฐ - Prototype / Class

osean 2020. 10. 5. 22:37

์•Œ์•„๋‘๋ฉด ์ข‹์€ Javascript

ํŒŒ์ด๋„ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์€ ๋Œ€๋ถ€๋ถ„ Ajax ๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ž์—ฐ์Šค๋ ˆ Javascript๋ฅผ ์ ‘ํ•  ๊ธฐํšŒ๊ฐ€ ๋งŽ์•˜๋Š”๋ฐ, ์ด๋ฒˆ์— Node.js ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉฐ ๋Š๊ผˆ๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ ๋งŒ๋‚œ Javascript๋Š” ์šฐ์ฃผ ๋จผ์ง€๋ณด๋‹ค ์ž‘์€ ์กด์žฌ๋ผ๋Š” ๊ฒƒ์„..

Prototype ํ†บ์•„๋ณด๊ธฐ

  • Prototype ์€ Class ์— ๋Œ€ํ•œ ๋ฌธ๋ฒ•์„ ๊ณต๋ถ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์ˆ˜์ ์œผ๋กœ ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฐœ๋…์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋‚˜๋Š” ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” Java ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•ด์„œ Javascript์˜ Class ๋ฌธ๋ฒ•๋„ ๊ธˆ๋ฐฉ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ์ค„ ์•Œ์•˜๋Š”๋ฐ ์ „ํ˜€ ์•„๋‹ˆ์—ˆ๋‹ค.
    Javascript๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์–ธ์–ด๋กœ์จ, Class ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ๋ณด๊ธฐ์—๋งŒ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ์›€์ง์ด๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•œ๋‹ค. ์ฆ‰, ๊ฒ‰์œผ๋กœ๋Š” ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์ธ ์ฒ™ ํ•˜์ง€๋งŒ ์†์œผ๋กœ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜์œผ๋กœ ์›€์ง์ด๊ณ  ์žˆ๋‹ค๋Š” ๋ง์ด๋‹ค.(๐Ÿช๊ฒ‰๋ฐ”์†์ด‰ ์žฌ์งˆ?)
    ๊ทธ๋ ‡๋‹ค๊ณ  Protytpe๊ณผ Class๊ฐ€ ๋น„์Šทํ•˜๋ƒ? ๊ทธ ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค! ํ•˜์ง€๋งŒ ๋‘๊ฐ€์ง€ ๊ฐœ๋…์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋‹ค.(๋ธ”๋กœ๊ทธ ์ฃผ์ธ์žฅ๊ป˜์„œ ๊ทธ๋žฌ๋‹ค.)
    ๊ทธ๋ ‡๊ธฐ์— ์œ„์˜ ๋‘ ๊ฐœ๋…์— ๋Œ€ํ•œ ์ฐจ์ด์ ์„ ์ดํ•ดํ•˜๊ณ  Class ๋ฌธ๋ฒ•์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ Prototype ์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์•Œ์•„์•ผ ํ•˜๊ณ , ์ด๋ฅผ ๋„˜์–ด Prototype-Object, Prototype-properties ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฌธ๋ฒ•๊ณผ ์ด์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์ตํ˜€์•ผ ํ•œ๋‹ค.

์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์€ ๋ธ”๋กœ๊ทธ ๋งํฌ

[Javascript ] ํ”„๋กœํ† ํƒ€์ž… ์ดํ•ดํ•˜๊ธฐ

Javascript ๊ธฐ์ดˆ - Object prototype ์ดํ•ดํ•˜๊ธฐ

Prototype?

Javascript์—์„œ๋Š” Class๋Š” ์—†์ง€๋งŒ(๊ฒ‰๋ฐ”์†์ด‰) ํ•จ์ˆ˜์™€ new ๋ฅผ ํ†ตํ•ด Class ์ฒ˜๋Ÿผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

// Dog ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  
// ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ eyes(๋ˆˆ), nose(์ฝ”)๋ผ๋Š” ์†์„ฑ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Œ์„ ์„ ์–ธํ•œ๋‹ค.
function Dog() {
    this.eyes = 2;
    this.nose = 1;
}

// ๋˜์ต์ด์™€ ๊ผฌ๋ง์ด๋Š” Dog ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , Dog ๋ผ๋Š” ๊ฒƒ์„ ๋ช…์‹œํ•œ๋‹ค.
var ๋˜์ต์ด = new Dog();
var ๊ผฌ๋ง์ด = new Dog();

console.log(๋˜์ต์ด.eyes); // ๋˜์ต์ด์˜ ๋ˆˆ์€ 2๊ฐœ์ด๋‹ค. Dog ํ•จ์ˆ˜์˜ eyes ์†์„ฑ์„ ์ƒ์†๋ฐ›๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
console.log(๊ผฌ๋ง์ด.nose); // ๊ผฌ๋ง์ด์˜ ์ฝ”๋Š” 1๊ฐœ์ด๋‹ค. Dog ํ•จ์ˆ˜์˜ nose ์†์„ฑ์„ ์ƒ์†๋ฐ›๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์œ„์™€ ๊ฐ™์ด ๋˜์ต์ด์™€ ๊ผฌ๋ง์ด๋Š” Dog๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋ฉฐ ์ด๋Š” eyes 2๊ฐœ, nose 1๊ฐœ๋ฅผ ๊ณตํ†ต์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ ์†์„ฑ์ด Dog ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด์˜ ๊ฐœ์ˆ˜๋งŒํผ ํ• ๋‹น๋œ๋‹ค. ์ฆ‰, ๋˜์ต์ด์™€ ๊ผฌ๋ง์ด๊ฐ™์€ ๊ฐ•์•„์ง€๋ฅผ 1000๋งˆ๋ฆฌ๋ฅผ ๋งŒ๋“ค๋ฉด 2000๊ฐœ์˜ ๋ณ€์ˆ˜๊ฐ€ ํ• ๋‹น๋œ๋‹ค.

์ด์™€ ๊ฐ™์ด ํŠน์ • ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜๋ก ํ• ๋‹นํ•ด์•ผ ํ•  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋งŽ์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ต‰์žฅํžˆ ๋น„ ํšจ์œจ์ ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ Prototype ์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

function Dog(){}

Dog.prototype.eyes = 2;
Dog.prototype.nose = 1;

var ๋˜์ต์ด = new Dog();
var ๊ผฌ๋ง์ด = new Dog();

console.log(๋˜์ต์ด.eyes);
console.log(๊ผฌ๋ง์ด.nose);

์œ„์˜ ์ฝ”๋“œ์—์„œ **Dog.prototype** ๋Š” ๋น„์–ด์žˆ๋Š” Object๋กœ์„œ ๋ฉ”๋ชจ๋ฆฌ ์–ด๋”˜๊ฐ€์— ์กด์žฌํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, Dog ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด ๋˜์ต์ด์™€ ๊ผฌ๋ง์ด๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ ์–ด๋”˜๊ฐ€์— ์กด์žฌํ•˜๋Š” Object์— ์žˆ๋Š” ๋ชจ๋“  ์†์„ฑ์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
์ฆ‰, Dog ํ•จ์ˆ˜์— ์กด์žฌํ•˜๋Š” eyes ์™€ nose ์†์„ฑ์„ ๋ฉ”๋ชจ๋ฆฌ ์–ด๋”˜๊ฐ€์— ์ €์žฅํ•˜๊ณ , ๋˜์ต์ด ์™€ ๊ผฌ๋ง์ด ๊ฐ€ Dog ํ•จ์ˆ˜์˜ eyes ์™€ nose ์†์„ฑ์„ ๊ณต์œ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

์ฆ‰, ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ์—์„œ Dog ํ•จ์ˆ˜๋Š” ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด์— ์†์„ฑ์„ ๋งŒ๋“ค์–ด ํ•ด๋‹น ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์งˆ ๊ฐ์ฒด์— ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์†์„ฑ์„ ํ• ๋‹นํ–ˆ๋‹ค. ๋ฐ˜๋ฉด ๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ์—์„œ Dog ํ•จ์ˆ˜๋Š” ๊ป๋ฐ๊ธฐ๋งŒ ์žˆ์„ ๋ฟ ์†์€ ํ…… ๋น„์—ˆ๋‹ค. ํ•˜์ง€๋งŒ **Object.prototype** ์ด๋ผ๋Š” ์†์„ฑ์„ ์ด์šฉํ•ด ๋ฒ”์šฉ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก(?) Dog ํ•จ์ˆ˜์˜ ์†์„ฑ์„ ์„ ์–ธํ•˜์˜€๋‹ค.
์ด๋กœ์จ Dog ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๊ฐ€ ๋ช‡ ๊ฐœ๊ฐ€ ๋˜๋“  **Dog.prototype** ์˜ eyes ์™€ nose ์†์„ฑ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Prototype Link? Prototype Object?

๋ธ”๋กœ๊ทธ์—์„œ๋Š” Javascript์˜ ๊ธฐ์ดˆ๊ฐ€ ํƒ„ํƒ„ํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ๋“ค์ด Prototype Link์™€ Prototype Object์— ๋Œ€ํ•ด ๋ช…ํ™•ํ•œ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค๊ณ  ๋งํ•œ๋‹ค.(== ๋‚˜)
๊ทธ๋ž˜์„œ ์ด ๋‘˜์ด ๋„๋Œ€์ฒด ๋ฌด์—‡์ด๋ฉฐ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๋จผ์ € Prototype Link ์™€ Prototype Obejct ๋Š” Prototype ์ด๋ผ๊ณ  ํ†ตํ‹€์–ด ๋ถ€๋ฅธ๋‹ค.

Prototype Link๋Š” ๋งˆ์น˜ Spring Framework ์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜์ธ Dependency(์ฃผ์ž…)์˜ ์ผ๋ถ€๋ถ„ ๊ฐ™์•˜๋‹ค.(๊ต‰์žฅํžˆ ์ฃผ๊ด€์ ์ธ ์˜๊ฒฌ) ์™œ๋ƒํ•˜๋ฉด ๋ธ”๋กœ๊ทธ์— ์ƒ์„ธํžˆ ๋‚˜์™€ ์žˆ๋Š” ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ํŠน์ • ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด์— ์†์„ฑ์ด ์„ ์–ธ๋˜์ง€ ์•Š์•˜๋Š”๋ฐ๋„ proto ๋ผ๋Š” ์†์„ฑ(Prototype Property)์„ ํ†ตํ•ด ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜์˜ ์†์„ฑ์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๋˜ํ•œ, ํ•ด๋‹น ์ด๋ฆ„์—์„œ๋„ ์•Œ ์ˆ˜ ์žˆ๋“ฏ Link ๋ผ๊ณ  ๋Œ€๋†“๊ณ  ๋งํ•˜๊ณ  ์žˆ๋‹ค. (Spring Framework ๋ฅผ ๊ณต๋ถ€ํ•  ๋•Œ Autowired ๋ฅผ ํ†ตํ•ด bean ์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ๋Œ์–ด๋‹ค ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ '๋งํฌ ๊ฑด๋‹ค' ๋ผ๊ณ  ํ‘œํ˜„ํ–ˆ๋˜ ๊ธฐ์–ต์ด ์žˆ๋‹ค.)
์ด๋ ‡๊ฒŒ ํŠน์ • ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ proto ์†์„ฑ์„ ํ†ตํ•ด ์†์„ฑ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ(์ƒ์œ„ ํ”„๋กœํ† ํƒ€์ž…๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ํ˜•ํƒœ)์„ Prototype Chain ์ด๋ผ๊ณ  ํ•œ๋‹ค.
์ด๋ฅผ ๋˜ ๋‹ค๋ฅธ ๊ด€์ ์œผ๋กœ ์ƒ๊ฐํ•ด๋ณด๋ฉด DOM ๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

https://miro.medium.com/max/1400/1*mwPfPuTeiQiGoPmcAXB-Kg.png

Prototype Object๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์›์‹œ์˜ ๊ฐ์ฒด๋ฅผ ๋œปํ•œ๋‹ค. Javascript์—์„œ ๋ชจ๋“  ๊ฐ์ฒด๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋˜๋Š”๋ฐ, Object, Function, Array ๋“ฑ ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค๋„ ํ•จ์ˆ˜๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด๋Š” ๋ชจ๋‘ ํ•จ์ˆ˜๋กœ ์ƒ์„ฑ๋œ๋‹ค๋Š” ํŠน์ง•์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•จ์ˆ˜๊ฐ€ ์ •์˜ ๋  ๋•Œ๋Š” ๋‘ ๊ฐ€์ง€ ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค.

  1. ํ•ด๋‹น ํ•จ์ˆ˜์— Constructor(์ƒ์„ฑ์ž) ์ž๊ฒฉ ๋ถ€์—ฌ
    • ์ƒ์„ฑ์ž ์ž๊ฒฉ์ด ๋ถ€์—ฌ๋˜๋ฉด new๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
  2. ํ•ด๋‹น ํ•จ์ˆ˜์˜ Prototype Object ์ƒ์„ฑ ๋ฐ ์—ฐ๊ฒฐ
    • ์ƒ์„ฑ์ž ์ž๊ฒฉ์„ ๋ถ€์—ฌํ•˜๊ฒŒ ๋˜๋ฉด์„œ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ ํ•จ๊ป˜ ์ƒ์„ฑ๋œ ํ•จ์ˆ˜๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ณ  ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ํŠน์ง•์„ ๊ฐ€์ง„ Protype Object๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฐ์ฒด๋กœ ์†์„ฑ์„ ์ž…๋ง›์— ๋งž๊ฒŒ ์ถ”๊ฐ€/์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ Protype Object์˜ ํŠน์ง•์œผ๋กœ ์ธํ•ด ํ•ด๋‹น ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Class ํ†บ์•„๋ณด๊ธฐ

์œ„์˜ Prototype ๊ฐœ๋…์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์กฐ๊ธˆ ๋˜์—ˆ๋‹ค๋ฉด ์ด์ œ Class ๊ฐœ๋…์— ๋Œ€ํ•ด ์ดํ•ดํ•  ์ฐจ๋ก€์ด๋‹ค.

// Human ํ•จ์ˆ˜ ์ƒ์„ฑ
var Human = function(type) {
    this.type = type || 'human';
}

Human.isHuman = function(human) {
    return human instanceof Human;
}

// Human()์„ ์ฐธ์กฐํ•˜์—ฌ ์ƒ์„ฑ๋  ๊ฐ์ฒด์— ๋ถ€์—ฌํ•  ์†์„ฑ ์„ ์–ธ
Human.prototype.breathe = function() {
    alert('h-a-a-a-m');
}

// Human()๋ฅผ ์ฐธ์กฐ๋ฐ›์•„ ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ
var sh = function(type, firstName, lastName) {
    Human.apply(this.arguments);
    this.firstName = firstName;
    this.lastName = lastName;
}

// ์œ„์—์„œ Human() ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐ๋ฐ›์•„ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด์˜ ๊ธฐ๋ณธ ์†์„ฑ ์„ค์ •
sh.prototype = Object.create(Human.prototype); // Human() ํ•จ์ˆ˜์˜ ์†์„ฑ์„ ๋ถˆ๋Ÿฌ์™€ ์„ค์ •ํ•œ๋‹ค.
sh.prototype.constructor = sh; // ์ƒ์„ฑ์ž๋Š” sh
sh.prototype.sayName = function() {
    alert(this.firstName + ' ' + this.lastName);
} // sh ๊ฐ์ฒด์— sayName ์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

var oldSh = new sh('human','SeongHeon','Sim');
Human.isHuman(oldSh);
console.log(Human.isHuman(oldSh))
// ์œ„์˜ ์ฝ”๋“œ์—์„œ Human ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ , ๊ทธ ํ•จ์ˆ˜๋ฅผ Zero ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์†ํ•œ๋‹ค.
// Zero ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด ์ƒ์†ก๋ฐ›๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๊ฐ€ ์ƒ๋‹นํžˆ ๋‚œํ•ดํ•œ๋ฐ, Human.apply ์™€ Object.create ๋ถ€๋ถ„์ด ์ƒ์†๋ฐ›์œผ๋ฉด์„œ ๋ณต์žกํ•ด์กŒ๋‹ค.

์œ„์˜ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ Prototype ์„ ์ด์šฉํ•ด ์ƒ์†์„ ๊ตฌํ˜„ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚œ์ƒ ์ฒ˜์Œ ๋ณด๋Š” ์ฝ”๋“œ๊ฐ€ ๋‚œ๋ฌดํ•ด์„œ ๊ฝค๋‚˜ ๋‹นํ™ฉํ–ˆ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋ฅผ Class ๋ฌธ๋ฒ•์„ ์ ์šฉํ•˜๋ฉด ์•„๋ž˜์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ฐ”๋€Œ๊ณ , ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ๊ฐ€๋…์„ฑ์ด ๋งŽ์ด ์ข‹์•„์กŒ๋‹ค๋Š” ๊ฒƒ์„ ๋Š๋‚„ ์ˆ˜ ์žˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด Java์˜ ํด๋ž˜์Šค ๊ตฌ์กฐ์™€ ๊ต‰์žฅํžˆ ๋น„์Šทํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค! ๋‹ค๋งŒ, Javascript์—์„œ ์•„๋ž˜์˜ ์ฝ”๋“œ๊ฐ€ ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ ํ•˜์ง€๋Š” ์•Š๋Š” ์ ์„ ์ฐธ๊ณ ํ•ด์•ผ ํ•œ๋‹ค.

// Class๋ฅผ ์ด์šฉํ•ด ์ƒ์† ๊ฐœ๋… ์ดํ•ดํ•˜๊ธฐ
// ํด๋ž˜์Šค ์„ ์–ธ
class Person{
    // Person ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ์„ ์–ธ
    constructor(type = 'person'){
        this.type = type;
    }

    // ์ •์  ๋ฉ”์†Œ๋“œ ์ƒ์„ฑ (์œ„์˜ ์ฝ”๋“œ์—์„œ Human.isHuman ๊ฐ™์€ ํด๋ž˜์Šค ํ•จ์ˆ˜)
    static isPerson(person) {
        return person instanceof Person;
    }

    // ์ˆจ์‰ฌ๋Š” ๋ฉ”์†Œ๋“œ ์ƒ์„ฑ
    breathe() {
        alert("ํ•˜-์•„-์•„-์•”");
    }
}

// Person ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” Ssh ํด๋ž˜์Šค ์ƒ์„ฑ
class Ssh extends Person {

    // ์ƒ์†๋ฐ›์€ Person ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ๋ถˆ๋Ÿฌ์™€ Ssh ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ’ ์„ค์ •
    constructor(type, firstName, lastName) {
        super(type);
        this.firstName = firstName;
        this.lastName = lastName;
    }

    // Ssh ํด๋ž˜์Šค์— sayName() ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด, 
    // ํ•ด๋‹น ํ•จ์ˆ˜์— Person ํด๋ž˜์Šค์˜ breathe() ํ•จ์ˆ˜ ์‚ฝ์ž…
    sayName() {
        super.breathe();
            alert(`${this.firstName} ${this.lastName}`);
    }
}

// newSsh ๊ฐ์ฒด๋ฅผ Ssh ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด ์ƒ์„ฑ
const newSsh = new Ssh('person','SeongHeon', 'Sim');
Person.isPerson(newSsh);