๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์‹œ๋„/Code-States

[D+53] Prototype Chain

by ๐Ÿ‡๋ฐ•๋ด‰๋ด‰๐Ÿ‡ 2020. 10. 29.

 

 

D+53

-  Prototype Chain -

(prototype, __ proto__, constructor์˜ ๊ด€๊ณ„

Object.create(), class์™€ super)

 


 

 

prototype, __proto__, constructor์˜ ๊ด€๊ณ„

 

 

prototype

ํ•จ์ˆ˜ func๋ฅผ ์ƒ์„ฑํ›„ fuc์˜ prototype์„ ๋ถˆ๋Ÿฌ์˜จ ๋ชจ์Šต

 

๋ชจ๋“  ํ•จ์ˆ˜์—๋Š” ํ”„๋กœํ† ํƒ€์ž…์ด๋ผ๋Š” ์†์„ฑ์ด ์กด์žฌํ•˜๋Š”๋ฐ,

์ด๋กœ ์ธํ•ด์„œ ์šฐ๋ฆฌ๋Š” prototype์„ ํ†ตํ•ด์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ”„๋กœํ† ํƒ€์ž…์— ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“  ๋ชจ์Šต

 

๋˜ํ•œ prototype์€ ๊ฐ™์€ ์ƒ์„ฑ์ž๋กœ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์ง„ ์ธ์Šคํ„ด์Šค ๊ฐ์ฒด๋“ค์€ prototype์„ ํ†ตํ•ด ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋˜ํ•œ ์šฐ๋ฆฌ๊ฐ€ MDN์„ ํ†ตํ•ด์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๊ฒฝ์šฐ ํ•ญ์ƒ ์ €๋ ‡๊ฒŒ prototype์ด ๋ถ™์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ

์ด๋Š” ํ•จ์ˆ˜์˜ ์›ํ˜•์— ๋ถ™์–ด์žˆ๋Š” ๋ฉ”์†Œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— prototype์ด ๋ถ™์–ด ์žˆ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

__proto__

prototype์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์„๋•Œ ๊ถ๊ธˆํ•œ ๊ฒƒ์ด ์ƒ๊ฒผ์„ ๊ฒƒ์ด๋‹ค.

 

๋ฐ”๋กœ ์ € __proto__๋Š” ๋ฌด์—‡์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ผ๊นŒ์— ๋Œ€ํ•œ ๊ถ๊ธˆ์ฆ ๋ง์ด๋‹ค.

 

__proto__์€ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๋ถ€๋ชจ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ,

์œ„์˜ ์ด๋ฏธ์ง€์—์„œ๋Š” func์˜ ๋ถ€๋ชจ๊ฐ์ฒด๋Š” Object๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ค€๋‹ค.

 

constructor

constructor์€ ์ƒ์„ฑ์ž๋ผ๋Š” ์˜๋ฏธ๋กœ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ดˆ๊ธฐํ™”๋  ๋•Œ ์‹คํ–‰ํ•˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์ด๋‹ค.

 

 

 


Object.create()

var Human = function(name) {
	this.name = name;
}

Human.prototype.sleep = function() {};

var steve = new Human('steve');

var Student = function(name) {

}

Student.prototype.learn = function() {};

var john = new Student('john');
john.learn();
john.sleep(); // ??????????

Human์€ sleep์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  Student๋Š” learn์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

์ด๋•Œ, Human์— steve๋ผ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์˜€๊ณ 

Student์—๋Š” john์ด๋ผ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์˜€๋‹ค.

 

์—ฌ๊ธฐ์„œ john์€ Student์˜ learn๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ

์ด๋•Œ ๋งŒ์•ฝ Human์˜ sleep ๋ฉ”์†Œ๋“œ๋„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

 

์ด๋•Œ๋Š” Student๊ฐ€ Human์„ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ฐธ์กฐํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ

๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ Object.create()์ด๋‹ค.

 

 

1) Object.create()

Student.prototype = Object.create(Human.prototype);
Student.prototype.learn = function() {};

Object.create()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ณต์‚ฌํ•  ํ”„๋กœํ†  ํƒ€์ž…์— Object.create๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ๋ฉด ๋˜๋Š”๋ฐ

์ด๋•Œ Object.create() ๊ด„ํ˜ธ ์•ˆ์—๋Š” ๋ณต์‚ฌํ•  ํ”„๋กœํ† ํƒ€์ž…์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

์šฐ๋ฆฌ๋Š” Student์— Human์„ ๋ณต์‚ฌํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์œ„์— ํ•ด๋‹น ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ž…๋ ฅํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

 

 

2) ์ƒ์„ฑ์ž์˜ ์ค‘์š”์„ฑ

1๋ฒˆ๊นŒ์ง€ ์ง„ํ–‰์„ ํ•ด์ฃผ๋ฉด Human์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

 

์›๋ž˜๋ผ๋ฉด student1์˜ ๋ถ€๋ชจ ๊ฐ์ฒด ์ƒ์„ฑ์ž๋Š” Student๊ฐ€ ๋‚˜์™€์•ผ ํ•˜์ง€๋งŒ

์ด์ƒํ•˜๊ฒŒ๋„ Human์ด ๋‚˜์™€๋ฒ„๋ฆฐ๋‹ค.

 

์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ Object.create()๋ฅผ ํ†ตํ•ด Human์„ ๋ณต์‚ฌํ•ด๋ฒ„๋ฆฌ๋ฉด์„œ ์ƒ์„ฑ์ž๋„ ๊ฐ€์ ธ์™”๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ ๊ฒƒ์ธ๋ฐ

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Student.prototype์˜ ์ƒ์„ฑ์ž๊ฐ€ Student๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๋ฉด ๋œ๋‹ค.

 

Student.prototype.constructor = Student;

 

๋ฐ”๋€Œ์–ด์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3) context ์ „๋‹ฌ

2๋ฒˆ๊นŒ์ง€ ์ง„ํ–‰ํ•ด์ฃผ์—ˆ๋‹ค๊ณ  ๋๋‚œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

 

newํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์คฌ์„ ๋•Œ Human์œผ๋กœ context๊ฐ€ ์ „๋‹ฌ์ด ์•ˆ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค.

 

์ด๋•Œ์— ์šฐ๋ฆฌ๋Š” call์„ ์‚ฌ์šฉํ•ด ์ค˜์„œ Human์œผ๋กœ ๊นŒ์ง€ ์ž˜ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

 


class์™€ super

๋ฐฉ๊ธˆ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์ฝ”๋“œ๋Š” pseudoclassical ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ œ์ž‘ํ•œ ์ฝ”๋“œ์ด๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜์ง€ ํ‰์†Œ์—” ์ž˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

์šฐ๋ฆฌ๋Š” ํด๋ž˜์Šค ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ๋”์šฑ ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

 

๊ธฐ์กด์— ์‚ฌ์šฉํ•œ ํ‚ค์›Œ๋“œ์—์„œ class๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๊ณ 

์ƒ์„ฑ์ž๋Š” ๋”ฐ๋กœ ํ•ด์ค„ ํ•„์š” ์—†์ด Human ํด๋ž˜์Šค ์•ˆ์—๋‹ค๊ฐ€ constructor๋ฅผ ์‚ฌ์šฉํ•ด ์ž…๋ ฅํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

 

๋˜ํ•œ Student ํด๋ž˜์Šค๊ฐ€ Human์„ ์ƒ์†๋ฐ›๊ธฐ ์œ„ํ•ด์„œ extends๋งŒ์„ ์ž…๋ ฅํ•ด ์ฃผ๋ฉด ๋˜๊ณ 

๋ฌผ๋ ค๋ฐ›์„ name์— ๊ด€ํ•œ ์ •๋ณด๋„ super๋ฅผ ์ด์šฉํ•ด ์ฃผ๋ฉด ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜์ง€๋งŒ

๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์™„์„ฑ๋œ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€