[JS] Prototype๊ณผ Prototype chain ๐Ÿ‘ฌ๐Ÿผ

Shin Hyun Wooยท2022๋…„ 5์›” 29์ผ
0
post-thumbnail

์ง€๊ธˆ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋งˆ์ง€๋ง‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ณ  ์žˆ์ง€๋งŒ, ๋‚ด๊ฐ€ ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋Š” ๋ถ€๋ถ„์ด ๋งŽ์•„์„œ ๊ฐ€์žฅ ์ฃผ์ถคํ–ˆ๋˜ ๋ถ€๋ถ„์ด Prototype์ด ๋‹ค๊ฐ€์™”์„ ๋•Œ ๋ถ€ํ„ฐ ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ž˜์„œ ์‹œ๊ฐ„์ด ์žˆ์„ ๋•Œ ๊ผญ Prototype์„ ์กฐ๊ธˆ์ด๋ผ๋„ ์ดํ•ดํ•˜๋„๋ก ํ•ด๋ณด์ž๋ผ๋Š” ๋งˆ์ธ๋“œ๋กœ ์˜ค๋Š˜ ์ •๋ฆฌ๋ฅผ ํ•œ๋‹ค.

ํ˜„์žฌ ์ฐธ์—ฌํ•˜๋Š” ๊ฐ•์˜์—์„œ๋„ ๋‹ค๋ฃจ์—ˆ์ง€๋งŒ ๊ฐ•์˜ ์ž๋ฃŒ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ–ˆ๋Š”๋ฐ ์•„๋ž˜์— ์ž‘์„ฑํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋„ˆ๋ฌด ๊นŠ๊ฒŒ ๋‹ค๋ฃฌ๋‹ค๋ฉด ๋๋„ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ๋กœ์„  ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” "Prototype"์˜ ๊ฐœ๋…๊ณผ "Prototype Chain"์— ๋Œ€ํ•ด์„œ ์Šค์Šค๋กœ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

Prototype์ด๋ž€?

์˜์–ด์ธ "Prototype"์„ ํ•ด์„ํ•˜๋ฉด ์–ด๋–ค ๋ง์ธ๊ฐ€?

"์›ํ˜•"์ด๋ผ๋Š” ๋œป์ด๋‹ค.
์—ฌ๊ธฐ์„œ ์›ํ˜•์€ "๊ฐ์ฒด์˜ ์›ํ˜•"์„ ์˜๋ฏธํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์›์‹œ ํƒ€์ž…์ธ number, string ๋“ฑ์„ ์ œ์™ธํ•œ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ์ฒด์ด๋‹ค.

์—ฌ๊ธฐ์„œ ๊ฐ์ฒด๋Š” ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋“ฏ์ด ์•„๋ž˜์ฒ˜๋Ÿผ key์™€ value์˜ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ Property๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

<script>
  let obj = {
  	name : "hyunwoo", // property
  	age : "30" // property
  }
</script>

์œ„์˜ ๊ฐ์ฒด obj๋ฅผ console.dir()์„ ํ†ตํ•ด ์ถœ๋ ฅํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์„ค์ •ํ–ˆ๋˜ ํ”„๋กœํผํ‹ฐ์ธ name๊ณผ age๊ฐ€ ๋ณด์ด๊ณ , ์•„๋ž˜์— ์šฐ๋ฆฌ๊ฐ€ ์„ค์ •ํ•˜์ง€๋„ ์•Š์€ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋„ ํ•จ๊ป˜ ์ถœ๋ ฅ์ด ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” Prototype์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์ฒ˜์Œ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค.

๋ณธ๋ก ์œผ๋กœ ๋“ค์–ด๊ฐ€์ž๋ฉด Prototype์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ ๋‚ด์˜ ์†์„ฑ๋“ค์€ "์ƒ์„ฑ์ž"๋ฅผ ํ†ตํ•ด์„œ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ ๊ทธ ๊ฐ์ฒด์— ์—ฐ๊ฒฐ๋œ๋‹ค.

์•„๋ž˜๋ฅผ ๋ณด๋„๋ก ํ•˜์ž.
์šฐ๋ฆฌ๋Š” ๊ฐ์ฒด์ธ ๋ณ€์ˆ˜ obj๋ฅผ ์ƒ์„ฑํ–ˆ๋Š”๋ฐ "๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด" ๋ฐฉ์‹์œผ๋กœ ์„ ์–ธ์„ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ "๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด" ๋ฐฉ์‹์œผ๋กœ ์„ ์–ธํ•œ ๊ฒƒ์€ ์‚ฌ์‹ค "์ƒ์„ฑ์ž ํ•จ์ˆ˜"๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๊ฒƒ์ด๋ผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์œ„์™€ ๋˜‘๊ฐ™์ด console.dir()๋กœ ์ถœ๋ ฅํ–ˆ์„ ๋•Œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๋œปํ•˜๋Š” Prototpye์˜ ํ”„๋กœํผํ‹ฐ์ธ constructor๋Š” ํ•จ์ˆ˜์ธ function Object(name, age)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ Prototype์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ดํ•ดํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.


์ƒ์„ฑ์ž ํ•จ์ˆ˜

์ƒ์„ฑ์ž๋Š” "ํ•จ์ˆ˜"์ธ๋ฐ ์•ž์— new ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์–ด์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด์ธ instance๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ๋ฐ˜ํ™˜ํ•˜๋Š” "์ƒ์„ฑ์ž ํ•จ์ˆ˜"๊ฐ€ ๋œ๋‹ค.
์œ„์—์„œ new Object()์ฒ˜๋Ÿผ ๋ง์ด๋‹ค.

<script>
  // ์ƒ์„ฑ์ž ํ•จ์ˆ˜ Sub() ์„ ์–ธ
  function Sub(name, age){
  	this.name = name;
  	this.age = age;
  }
  
  // ์ƒˆ๋กœ์šด ๊ฐ์ฒด instance ์ƒ์„ฑ
  var obj = new Sub("hyunwoo", 30);
</script>

๊ทธ๋Ÿฐ๋ฐ ์šฐ๋ฆฌ๋Š” ๋ˆ„๊ฐ€๋ด๋„ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ ๊ฐ์ฒด์˜ ์ƒ์„ฑ์€ ๋งค์šฐ ๋ถˆํŽธํ•ด๋ณด์ธ๋‹ค.
๊ทธ๋ƒฅ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ํ†ตํ•ด var obj = { name:"hyunwoo", age:30}์ฒ˜๋Ÿผ ์ ์œผ๋ฉด ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ง์ด๋‹ค.

์ด ๋ถ€๋ถ„์—์„œ๋Š” "๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)"๊ฐ€ ๋Œ€๋‹ต์ด ๋  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ ๊ฒŒ์ž„์—์„œ ์บ๋ฆญํ„ฐ๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„๊นŒ?

<script>
  const user1 = {
	name: "John",
  	hp : 85,
  	skill : "fire ball",
  	xp : 0,
  }
  
  const user2 = {
	name: "Jane",
  	hp : 120,
  	skill : "strike",
  	xp : 0,
  }
  
  const user3 = {
	name: "Mike",
  	hp : 120,
  	skill : "blink",
  	xp : 0,
  }
</script>

์œ„์ฒ˜๋Ÿผ ์œ ์ € ํ•˜๋‚˜ ํ•˜๋‚˜์˜ name, hp, mp, skill ๋“ฑ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•ด์ค˜์•ผํ•œ๋‹ค๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ๋‹ค.
์ผ์ผ์ด ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค๋ฉด ๊ทธ๋งŒํผ ์‹œ๊ฐ„๊ณผ ๊ฐ™์ด ๋ฆฌ์†Œ์Šค์˜ ์†Œ๋ชจ๋„ ํฌ๊ณ , ์‹ค์ˆ˜์˜ ๊ฐ€๋Šฅ์„ฑ๋„ ์ปค์ง„๋‹ค.

๊ทธ๋ž˜์„œ ์œ„์˜ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด ๋ฐ์ดํ„ฐ์˜ xp : 0๋ผ๋Š” key์™€ value๊ฐ€ ๋™์ผํ•˜๊ฒŒ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์ด๊ฒƒ์„ ํ•˜๋‚˜์˜ ์„ค๊ณ„๋„๋ฅผ ๋‘๊ณ  ๋ฐ์ดํ„ฐ ๊ฐ’๋งŒ ๋”ฐ๋กœ ์ž‘์„ฑ์„ ํ•œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ?

์•„๋ž˜์˜ ์˜ˆ์ œ๋Š” ์•„์ง์€ ์ •๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์€ ํด๋ž˜์Šค(Class)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
๊ฐ„๋‹จํžˆ ๋งํ•˜์ž๋ฉด ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” "์„ค๊ณ„๋„"์ด๋ฉฐ "ํ…œํ”Œ๋ฆฟ" ๊ฐ™์€ ๊ฐœ๋…์ด๋‹ค.

๋‹ค์Œ ๊ฒŒ์‹œ๊ธ€๋กœ ํด๋ž˜์Šค๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. ๐Ÿ˜„

<script>
  // ์œ ์ €๋ฅผ ์ƒ์„ฑํ•  ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค ์ƒ์„ฑ
  class User {
  	constructor(name, hp, skill){
  		this.name = name;
  		this.hp = hp;
  		this.skill = skill;
  		this.xp = 0;
  	}
  }
  
  const user1 = new User("John", 85, "fire ball");
  const user2 = new User("Jane", 120, "strike");
  const user3 = new User("Mike", 120, "blink");
</script>

์œ„์ฒ˜๋Ÿผ ์ž‘์„ฑ ์‹œ ์ด์ „ ์˜ˆ์ œ์™€ ๊ฐ™์€ ๊ฐ’์ด ์ถœ๋ ฅ์ด ๋œ๋‹ค. ํ›จ์”ฌ ๊ฐ€๋…์„ฑ์ด ์‰ฌ์›Œ์ง€๊ณ  ๊ฐ’์„ ๋„ฃ๊ธฐ์—๋„ ํŽธ๋ฆฌํ•ด์ง€๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์•„์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒƒ๊ณผ ๋˜‘๊ฐ™์ด Prototype์„ ํ†ตํ•ด์„œ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

<script>
  function User(name, hp, skill){
  	this.name = name;
  	this.hp = hp;
  	this.skill = skill;
  }
  
  // prototype์„ ํ†ตํ•œ xp ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑ
  User.prototype.xp = 0;
  
  const user1 = new User("John", 85, "fire ball");
</script>

์œ„์ฒ˜๋Ÿผ ์ƒ์„ฑ์žํ•จ์ˆ˜์˜ Prototype๋ฅผ ํ†ตํ•ด ํ”„๋กœํผํ‹ฐ xp๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  user1์„ console.log()๋กœ ํ™•์ธ์„ ํ–ˆ์„ ๋•Œ ์•„๋ž˜์ฒ˜๋Ÿผ ์ถœ๋ ฅ์ด ๋œ๋‹ค.

๊ทผ๋ฐ ์šฐ๋ฆฌ๊ฐ€ ์ƒ์„ฑํ•œ ํ”„๋กœํผํ‹ฐ xp๋Š” ๋ณด์ด์ง€ ์•Š๋Š”๋ฐ ์–ด๋””์— ์žˆ๋Š” ๊ฒƒ์ผ๊นŒ?

xp๋Š” ๋ฐ”๋กœ Prototype ์•ˆ์— ์กด์žฌํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ๋งŒ์•ฝ xp์˜ ๊ฐ’์„ ํ•„์š”ํ•  ๋•Œ ๊ฐ์ฒด ๋‚ด์— ์ถœ๋ ฅ๋˜๋Š” ํ”„๋กœํผํ‹ฐ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋ฌธ์ œ์—†์ด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Prototype์„ ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜์ž๋ฉด ์กฐ์ƒ์œผ๋กœ๋ถ€ํ„ฐ ๋ฌผ๋ ค๋ฐ›์€ "์œ ์ „์ž"๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์กฐ์ƒ ์ค‘ ์šด๋™์„ ์ˆ˜๊ฐ€ ์žˆ์„ ๋•Œ ๋‚ด๊ฐ€ ์šด๋™์— ๋Œ€ํ•œ ์žฌ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋ชจ๋ฅด์ง€๋งŒ ์šด๋™์ข…๋ชฉ์—์„œ ๋‚˜๋„ ๋ชจ๋ฅด๊ฒŒ ๋Šฅ๋ ฅ์„ ๋ฐœํœ˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋Ÿฐ ๊ฐœ๋…์œผ๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. ๐Ÿ˜…

์—ฌ๊ธฐ์„œ ๋ฌผ๋ ค๋ฐ›๋Š” ๊ฐœ๋…์„ Prototype Chain์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค!


Prototype Chain

๋‚˜๋Š” ๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉด์„œ "์ฒด์ด๋‹"์ด๋ผ๋Š” ๋ง์„ ๋งŽ์ด ๋“ค์—ˆ๋‹ค.
์ฒด์ธ์€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๐Ÿ”— ์‚ฌ์Šฌ์„ ๋งํ•˜๋Š” ๊ฒƒ์ด๋‹ˆ ์—ฐ๊ฒฐ๋œ๋‹ค๋Š” ๋œป์œผ๋กœ ์ดํ•ดํ–ˆ์—ˆ๋Š”๋ฐ ์ฒด์ด๋‹ ๊ฐœ๋…์ด ์ •ํ™•ํžˆ ์ผ์น˜ํ•œ๋‹ค.

"์—ฐ์‡„์ ์œผ๋กœ ์ด์–ด์ง€๋Š” ๋™์ž‘ ๋ฐฉ์‹"์ด๋ผ๊ณ  ์ƒ๊ฐ์„ ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

์‹ค์šฉ์ ์ธ ์˜ˆ์ œ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๊ฐœ๋…์„ ์ดํ•ด๋ฅผ ์œ„ํ•ด ์ƒํ™œ์ฝ”๋”ฉ์—์„œ ๊ฐ€์ ธ์˜จ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž.

<script>
  function Ultra(){};
  Ultra.prototype.ultraProp = true; // ์ด ๋ถ€๋ถ„์„ ์ฃผ๋ชฉํ•ด์•ผํ•œ๋‹ค.

  function Super(){};
  Super.prototype = new Ultra();

  function Sub(){};
  Sub.prototype = new Super();

  var o = new Sub();
  console.log(o.ultraProp); // ์–ด๋–ค ๊ฐ’์ด ๋‚˜์˜ฌ๊นŒ?
</script>

console.log(o.ultraProp)์„ ์ถœ๋ ฅํ•˜๋ฉด ์–ด๋–ค ๊ฐ’์ด ๋‚˜์˜ฌ๊นŒ?

๋‚˜๋Š” ์ฒ˜์Œ์— ๋ณ€์ˆ˜ o๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜ new Sub()๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค์ด๊ณ  function Sub(){}๋ฅผ ๋ณด์•„ํ•˜๋‹ˆ ์•„๋ฌด๋Ÿฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•˜์œผ๋‹ˆ๊นŒ undefined๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์„๊นŒ? ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‚˜์˜ค๋Š” ๊ฐ’์€ true๊ฐ€ ๋‚˜์˜จ๋‹ค.

์ฝ”๋“œ๋ฅผ ํ•˜๋‹ˆ์”ฉ ์„ค๋ช…์„ ํ•˜์ž๋ฉด ์ด๋ ‡๋‹ค.

<script>
  function Ultra(){}; // ์ƒ์„ฑ์ž ํ•จ์ˆ˜ Ultra() ์„ ์–ธ
  Ultra.prototype.ultraProp = true; // Ultra์˜ Prototype์„ ํ†ตํ•ด ํ”„๋กœํผํ‹ฐ ultraProp ์˜ ํ‚ค์™€ ๊ฐ’ ์ƒ์„ฑ

  function Super(){}; // ์ƒ์„ฑ์ž ํ•จ์ˆ˜ Super() ์„ ์–ธ
  Super.prototype = new Ultra(); // Super.prototype์„ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ Ultra()์˜ ์ธ์Šคํ„ด์Šค๋กœ ์ƒ์„ฑ

  function Sub(){}; // ์ƒ์„ฑ์ž ํ•จ์ˆ˜ Sub() ์„ ์–ธ
  Sub.prototype = new Super(); // Sub.prototype์„ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ Super()์˜ ์ธ์Šคํ„ด์Šค๋กœ ์ƒ์„ฑ

  var o = new Sub(); // ๋ณ€์ˆ˜ o๋ฅผ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ Sub()์˜ ์ธ์Šคํ„ด์Šค๋กœ ์ƒ์„ฑ
  console.log(o.ultraProp); // true
</script>

๋ณด๋ฉด "์ด๊ฒŒ ๋ฌด์Šจ ์ฝ”๋“œ์ง€?"๋ผ๋Š” ์ƒ๊ฐ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ์†”์งํžˆ ๋‚˜๋„ ์ฒ˜์Œ ๋ดค์„ ๋•Œ ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ํ•ด์„ํ•ด์•ผํ•˜๋Š” ๊ฑด์ง€ ๋ชฐ๋ž๋‹ค.

๊ทผ๋ฐ ๋ณด๋ฉด ๊ณตํ†ต์ ์ธ ๋ถ€๋ถ„์ด ๋งŽ๋‹ค. ๊ฐ ์ธ์Šคํ„ด์Šค์ธ prototype์€ ๊ฐ๊ฐ์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ Prototype์€ "์œ ์ „์ž"๋ผ๊ณ  ํ–ˆ๋‹ค.

๋ณด์ด์ง€๋Š” ์•Š์ง€๋งŒ ํ˜„์žฌ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ Ultra๊ฐ€ ๊ฐ€์ง„ protoype.ultraProp๋Š” ์•„๋ž˜์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ–ฅ์„ ์ฃผ๊ณ  ์žˆ๋‹ค.
๊ฐ๊ฐ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋“ค์„ console.log()๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž.

์ ์ฐจ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ Prototype๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด์„œ ultraProp๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์ด๊ฒƒ์€ Prototype์˜ ์ƒ์†๋•Œ๋ฌธ์ธ๋ฐ ๊ทธ๋ฆผ์œผ๋กœ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•ด๊ฒ ๋‹ค.

Ultra์—์„œ Prototype์„ ํ†ตํ•ด ์ƒ์„ฑํ•œ ultraProp = true๋Š” ๋‚ด๊ฐ€ ์„ค๋ช…ํ•œ "์œ ์ „์žํ™”"๊ฐ€ ๋˜์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ƒ์œ„ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)์ธ Ultra๋กœ๋ถ€ํ„ฐ Super๊ฐ€ ultraProp = true๋ฅผ ๋ฌผ๋ ค๋ฐ›๊ฒŒ ๋˜๊ณ 

์•„๋ž˜์˜ ์ธ์Šคํ„ด์Šค ๋˜ํ•œ ๋ชจ๋‘ ์ƒ์†์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹น์‚ฌ์ž๋Š” ๋ชจ๋ฅด์ง€๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์ ‘๊ทผ์„ ํ†ตํ•ด ๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฅผ Prototype Chain์— ์˜ํ•ด ์ด๋ฃจ์–ด์กŒ๋‹ค๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.


Prototype์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ ์–ด๋–ค ๊ณผ์ •์ด ์ผ์–ด๋‚˜๋Š”๊ฐ€?

<script>
  function Ultra(){};
  Ultra.prototype.ultraProp = true; // ์ด ๋ถ€๋ถ„์„ ์ฃผ๋ชฉํ•ด์•ผํ•œ๋‹ค.

  function Super(){};
  Super.prototype = new Ultra();

  function Sub(){};
  Sub.prototype = new Super();

  var o = new Sub();
  console.log(o.ultraProp); // ์–ด๋–ค ๊ฐ’์ด ๋‚˜์˜ฌ๊นŒ?
</script>

ํ˜„์žฌ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋ณด์ž๋ฉด ultraProp๋ฅผ ์ƒ์„ฑํ•œ ๊ณณ์€ Ultra์ด๋‹ค.
ํ•˜์ง€๋งŒ ๋ณ€์ˆ˜ o์—์„œ ultraProp์— ์ ‘๊ทผ์„ ํ–ˆ์„ ๋•Œ true๊ฐ€ ๋ฐ˜ํ™˜์ด ๋˜์—ˆ๋‹ค.

๊ณผ์ •์ด ์–ด๋–ป๊ฒŒ ๋œ ๊ฒƒ์ธ์ง€ ๋ณด๋„๋ก ํ•˜์ž.

์ด๋Ÿฐ ์‹์œผ๋กœ ์ž์‹ ์—๊ฒŒ์„œ ์ฐพ๋‹ค๊ฐ€ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด ์ƒ์œ„ ๊ฐ์ฒด๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ์ฐพ์•„์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด Prototype Chain์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ค‘์š”ํ•œ ์ ์€ ์ƒ์œ„ ๊ฐ์ฒด๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ๊ฒ€์ƒ‰์„ ํ–ˆ์„ ๋•Œ ๋จผ์ € ๋‚˜์˜ค๋Š” ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.




์ •๋ฆฌ๋ฅผ ๋งˆ์น˜๋ฉฐ โ›ณ๏ธ

์˜ค๋Š˜์€ ์ง„์งœ ๊ณต๋ถ€ํ•œ ๋Š๋‚Œ์ด ๋“ค์–ด์„œ ๋ฟŒ๋“ฏํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

๋‚ด๊ฐ€ ๋ชฐ๋ž๋˜ ๋ถ€๋ถ„์„ ๊นจ๋‹ซ๊ณ  ์ด๊ฒƒ์„ ๊ณต๋ถ€ํ•ด์•ผ์ง€๋ผ๊ณ  ๊ณ„ํš์„ ํ–ˆ๋Š”๋ฐ ์—ด์‹ฌํžˆ ์ค€๋น„๋ฅผ ํ•˜๋ฉด์„œ ์ •๋ฆฌ๋ฅผ ํ•˜๊ณ  ๋‚˜๋‹ˆ ๋”์šฑ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฌผ๋ก  ์œ„์— ์žˆ๋Š” ์ •๋ณด๋ฅผ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์ฐธ๊ณ ๋ฅผ ํ–ˆ๊ณ  ๋‚˜์˜ ์ดํ•ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑ์ด ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋ชป๋œ ๋ถ€๋ถ„๋„ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ๋ถ„๋“ค๊ป˜ ํ™•์ธ์„ ๋ฐ›๊ณ  ์ˆ˜์ •์„ ํ•ด๋ณผ ์˜ˆ์ •์ด๋‹ค.

์˜ค๋žœ๋งŒ์— ๋‚˜์˜ ๊ณต๋ถ€ํ•œ ๊ธฐ๋ก์„ ์ ๋Š”๋ฐ ์žฌ๋ฏธ์žˆ์—ˆ๋‹ค. ๋‹ค์Œ์€ ํด๋ž˜์Šค๋ฅผ ์ •๋ฆฌ๋ฅผ ํ•  ๊ฑด๋ฐ ๊ธฐ๋Œ€๊ฐ€ ๋œ๋‹ค. ๐Ÿ˜„

profile
untiring_dev - Notion ํŽ˜์ด์ง€๋Š” ์ •๋ฆฌ ์ค‘!

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