JavaScript ๋ฌธ๋ฒ• - prototype chaining

๋ฐฑ์—”๋“œยท2020๋…„ 11์›” 22์ผ
0

Javascript ๋ฌธ๋ฒ•

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

๐Ÿ’ป prototype chaining์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž


๐Ÿ“Œ ๋จผ์ € ์•„๋ž˜์˜ ๊ทธ๋ฆผ์„ ์ดํ•ดํ•˜์ž

๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด์€ Array ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ Array.prototype๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

Array.prototype์—๋Š” ๋ฐฐ์—ด๋ฉ”์„œ๋“œ๊ฐ€ ๋ชจ๋‘ ๋‹ด๊ฒจ์žˆ๋‹ค.
์ฆ‰, Array.prototype๋Š” ๊ฐ์ฒด์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  __proto__๊ฐ€ ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด instance๊ฐ€ ๋งˆ์น˜ ์ž์‹ ์˜ ๋ฉ”์„œ๋“œ์ธ๊ฒƒ์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, prototype๊ฐ€ ๊ฐ์ฒด๋ผ๋Š” ๋ง์€
๊ณง, Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ new ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑ๋œ instance๋ผ๋Š” ๋ง์ด ๋œ๋‹ค.
๋”ฐ๋ผ์„œ Object์˜ prototype๋ฅผ ์ƒ์†๋ฐ›๊ฒŒ ๋œ๋‹ค.

์ด์ œ ๋ฐฐ์—ด์€ Object์˜ prototype์— ์žˆ๋Š” ๋ฉ”์„œ๋“œ ์—ญ์‹œ ๋งˆ์น˜ ์ž์‹ ์˜ ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ __proto__๋ผ๋Š” ๋นจ๊ฐ„์ƒ‰ ์„ ์„ ๋”ฐ๋ผ์„œ ์—ฐ๊ฒฐ๋œ ๊ฒƒ์„ prototype chaining์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

prototype๋Š” ๋ชจ๋‘ ๊ฐ์ฒด์ด๋ฏ€๋กœ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ํ•œ๊ฒฐ๊ฐ™์ด ์ด์™€ ๋™์ผํ•œ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅธ๋‹ค.


๐Ÿ‘€ ๋ฌธ์ž์—ด์„ ์˜ˆ๋กœ ๋“ค์–ด ์‚ดํŽด๋ณด์ž

๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ์ž๋™์œผ๋กœ String์˜ instance๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

๊ธฐํƒ€ ๋ฐ์ดํ„ฐ ํƒ€์ž…๋„ ๋ชจ๋‘ ์ด์™€ ๊ฐ™์€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๊ณ , ๊ฐ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ prototype์—๋Š” ๊ฐ ๋ฐ์ดํ„ฐ ํƒ€์ž…์—๋งŒ ํ•ด๋‹นํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๋Œ€ํ•ด์„œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ prototype์ธ __proto__๋กœ ์—ฐ๊ฒฐ๋œ Object.prototype์—๋Š”
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ „์ฒด๋ฅผ ํ†ต๊ด„ํ•˜๋Š” ๊ณตํ†ต๋œ ๋ฉ”์„œ๋“œ๋“ค์ด ์ •์˜ ๋˜์–ด ์žˆ๋‹ค.

Object.prototype์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋“ค์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด prototype chaining์„ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค


๐Ÿ˜  ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๊ฐ์ฒด์˜ prototype์—๋Š” ํ•ด๋‹น ๊ฐ์ฒด์—๋งŒ ์ ์šฉ๋  ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•ด๋‘˜ ์ˆ˜ ์—†๋‹ค.
๊ฐ์ฒด์˜ prototype์— ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋“ค์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐํƒ€์ž…์— ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํƒ€์ž…๋“ค์ฒ˜๋Ÿผ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์— ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์€๋ฐ, ๊ทธ๋Ÿฌ์ž๋‹ˆ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์•„ ๋ฒ„๋ฆฌ๊ฒŒ ๋œ๋‹ค.
๊ทธ๋ž˜์„œ ์–ด์ฉ” ์ˆ˜ ์—†์ด ๊ฐ์ฒด ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์ง์ ‘ ๋ฉ”์„œ๋“œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด๋ฒ„๋ ธ๋‹ค .

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ instance ๋ฐฐ์—ด์„ ํ†ตํ•ด Array property(ex, length)์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ๋ฐ(prototype์˜ property๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ), ๋ฐ˜๋ฉด์— Object์˜ ๊ฒฝ์šฐ instance๋ฅผ ํ†ตํ•ด ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๊ณ  Object.assign()๊ณผ ๊ฐ™์ด Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค.


๐Ÿ“Ÿ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž(๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ)

1. arr.toString์„ ์ •์˜ํ•œ ๊ฒฐ๊ณผ ๊ฐ’ ์ถœ๋ ฅ
   
   
2. Array.toString ๊ฒฐ๊ณผ ๊ฐ’ ์ถœ๋ ฅ(call์„ ํ†ตํ•ด arr๋กœ this ๋ฐ”์ธ๋”ฉ)


3. Object.toString ๊ฒฐ๊ณผ ๊ฐ’ ์ถœ๋ ฅ
		

1. Array.toString ๊ฒฐ๊ณผ ๊ฐ’ ์ถœ๋ ฅ(prototype๋กœ ์ง์ ‘ ๋ฉ”์„œ๋“œ ์ •์˜)

2. Array.toString ๊ฒฐ๊ณผ ๊ฐ’ ์ถœ๋ ฅ(call์„ ํ†ตํ•ด arr๋กœ this ๋ฐ”์ธ๋”ฉ)

3. Object.toString ๊ฒฐ๊ณผ ๊ฐ’ ์ถœ๋ ฅ

์•„๋ž˜ ์‚ฌ์ง„, console.dir(Object) toString ๋ฉ”์„œ๋“œ ์กด์žฌ


๐Ÿ“š ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž(๊ฐ์ฒด์ธ ๊ฒฝ์šฐ)

obj.toString()์„ ํ•  ๊ฒฝ์šฐ, Object.toString์ด ํ˜ธ์ถœ๋œ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ๋ฌธ์ž์—ด๋กœ ์ด์˜๊ฒŒ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด๋ดค๋‹ค.

๐Ÿ˜  ํ•˜์ง€๋งŒ b : [object Object]๊ฐ€ ์ถœ๋ ฅ๋˜์–ด ์—ฌ์ „ํžˆ ๋ง˜์— ๋“ค์ง€ ์•Š๋Š”๋‹ค.

์ด๋ ‡๊ฒŒ ์ถœ๋ ฅ๋˜๋Š” ์ด์œ ๋Š” b๊ฐ€ ๊ฐ์ฒด์ด๋ฏ€๋กœ key๊ฐ€ b์ผ๋•Œ, this๊ฐ€ object๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ref

profile
๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž

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

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด