Prototypes in Javascript

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์„ธ๊ณ„์˜ ๊ฐ€์กฑ ๊ด€๊ณ„๋„๋ฅผ ์•Œ์•„๋ณด๊ฒ ๋‹ค. ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ (์˜ค์ž‰?)

ํ‚ค์›Œ๋“œ๋Š”

  • prototype (์•„๋น )

  • constructor (์—„๋งˆ)

  • instance (์ž์‹)

์ด ๋  ๊ฒƒ์ด๋‹ค.

Prototype

์ด๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ๋œปํ•˜๋Š” ์˜๋ฏธ๋Š” ์›์ดˆ์ ์ธ ํ˜•ํƒœ , ์›๋ž˜์˜ํ˜•ํƒœ๋ฅผ ๋งํ•œ๋‹ค.

Constructor

์ƒ์„ฑ์žํ•จ์ˆ˜ new ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ์“ฐ์ด๋Š” ํ•จ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค.

you don't konw js ์ฑ…์—์„œ์˜ ์ •์˜๋„ ์ฐพ์•„๋ณด์ž

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ƒ์„ฑ์ž๋Š” ์•ž์— new ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์— ๋ถˆ๊ณผํ•˜๋‹ค. ํด๋ž˜์Šค์— ๋ถ™์€ ๊ฒƒ๋„ ์•„๋‹ˆ๊ณ  ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šคํ™” ๊ธฐ๋Šฅ๋„ ์—†๋‹ค. ์‹ฌ์ง€์–ด ํŠน๋ณ„ํ•œ ํ˜•ํƒœ์˜ ํ•จ์ˆ˜๋„ ์•„๋‹ˆ๋‹ค. ๋‹จ์ง€ new๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœํ•  ๋•Œ ์ž๋™์œผ๋กœ ๋ถ™๋“ค๋ ค ์‹คํ–‰๋˜๋Š” ๊ทธ์ € ํ‰๋ฒ”ํ•œ ํ•จ์ˆ˜๋‹ค.

15.7.2 Number ์ƒ์„ฑ์ž(ES5.1๋ช…์„ธ) new ํ‘œํ˜„์‹์˜ ์ผ๋ถ€๋กœ ํ˜ธ์ถœ ์‹œ Number๋Š” ์ƒ์„ฑ์ž์ด๋ฉฐ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

new๋ฅผ ๋ถ™์—ฌ์„œ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๊ณ  ์ด๋Š” ๊ฒฐ๊ตญ ์ƒ์„ฑ์ž ํ˜ธ์ถœ์ด๋‚˜ ๋‹ค๋ฆ„์—†๋‹ค. ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ˜ธ์ถœ์ด๋ผ๊ณ  ํ•ด์•ผ ์˜ณ๋‹ค.

์—ฌ๊ธฐ์„œ ์ฃผ๋ชฉํ•˜๊ฒŒ ๋˜๋Š” ํ‚ค์›Œ๋“œ๋“ค์ด ์žˆ๋‹ค. ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค์™€ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ˜ธ์ถœ ์ดํ•ด๊ฐ€ ์ž˜ ๋˜๋Š” ํ‚ค์›Œ๋“œ๋‹ค!

๋˜ํ•œ ์ถ”๊ฐ€๋กœ new๋ฅผ ๋ถ™์—ฌ ์ƒ์„ฑ์ž ํ˜ธ์ถœ์„ ํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๊ฐ„๋žตํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž.

  • ์ƒˆ ๊ฐ์ฒด๊ฐ€ ํˆญ ๋งŒ๋“ค์–ด์ง„๋‹ค.

  • ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ [[Prototype]]์ด ์—ฐ๊ฒฐ๋œ๋‹ค.

  • ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” ํ•ด๋‹น ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ this๋กœ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.

  • ์ด ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์˜ ๋˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ํ•œ new์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๋Š” ์ž๋™์œผ๋กœ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

new ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ์“ฐ์ด๋Š” ํ•จ์ˆ˜

  • new Array(); - ์—ฌ๊ธฐ์„œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” Array(); ์ด๋‹ค.

  • new Object();

  • new Function();

ํŠน์ง•์ด ์žˆ๋Š”๋ฐ ํ•จ์ˆ˜๋ช…์˜ ์ฒซ๊ธ€์ž๋Š” ๋Œ€๋ฌธ์ž๋ฅผ ์“ด๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ๊นŒ์ง€ ์ด๋ ‡๊ฒŒ ์ง์ ‘์ ์œผ๋กœ ์“ฐ์ง€ ์•Š์•˜์–ด๋„ ์šฐํšŒํ•ด์„œ ์‚ฌ์šฉํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ๋งŒ๋“ค์–ด ์ง„๊ฒƒ์ด๋‹ค!

var arr = [];
varr arr = new Array(); // ์‚ฌ์‹ค์ƒ ๋˜‘๊ฐ™์€ ๊ฒƒ์ด๋‹ค.

๋˜ํ•œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋„ ํ•จ์ˆ˜์ด๊ณ  -> ํ•จ์ˆ˜๋„ ๊ฐ์ฒด์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ƒ์„ฑ์žํ•จ์ˆ˜๋„ -> ๊ฐ์ฒด์ด๋‹ค. ํ•จ์ˆ˜์ธ๋ฐ ๊ฐ์ฒด์ด๋‹ค? ์ด๊ฒƒ์ด ๋ฌด์Šจ๋œป์ด๋ƒํ•˜๋ฉด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ๊ฐ์ฒด์˜ ํŠน์ง•์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ ํŠน์ง•์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด์ž.

๊ฐ์ฒด์˜ ํŠน์ง• key์™€ value๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋„ Key์™€ value๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ƒ์„ฑ์ž ํ•จ์ˆ˜์ธ Array() , Object(), Function()๋„ key์™€ value๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ Array(), Object(), Function()์€ ๊ณตํ†ต์ ์œผ๋กœ ์“ฐ์ด๋Š”๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ key์™€ value๋Š” ๋งŒ๋“ค์ง€ ์•Š๋Š”๊ฒŒ ์ข‹๋‹ค.

๋˜ํ•œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ์›ํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ƒ์„ฑ์ž ํ•จ์ˆ˜์ธ์ง€์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ํŒ๋‹จ์€ ์“ฐ์ž„์— ๋”ฐ๋ผ ๋งž๋ƒ ์•„๋‹ˆ๋ƒ๋กœ ๋‚˜๋‰  ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ ํ•จ์ˆ˜์™€ prototype์˜ ๊ด€๊ณ„๋ฅผ ์•Œ์•„๋ณด์ž.

ํ•จ์ˆ˜์™€ prototype์˜ ๊ด€๊ณ„ - ๋ชจ๋“  ํ•จ์ˆ˜๋Š” prototype ์†์„ฑ์ด ์žˆ๋‹ค!

ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๋ฉด ๋ฌด์กฐ๊ฑด prototype์ด๋ผ๋Š” ์†์„ฑ์ด ๊ปด์žˆ๋‹ค.

function foo () {
    return 3;
}
//๋ชจ๋“  ํ•จ์ˆ˜์—๋Š” prototype์ด๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค!
console.log(foo.prototype); // {constructor: ฦ’} 

function Foo () {
    return 3;
}
//๋ชจ๋“  ํ•จ์ˆ˜์—๋Š” prototype์ด๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค!
console.log(Foo.prototype); // {constructor: ฦ’}

์ฝ˜์†”์— ์ง์ ‘ ์ฐ์–ด๋ณธ๋‹ค๋ฉด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ๋งž๋˜ ์•„๋‹ˆ๋˜ ํ•จ์ˆ˜๋ช….prototype์œผ๋กœ ์ฐ์–ด๋ณด๋ฉด ํ•จ์ˆ˜๋Š” prototype์ด๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๊ฐ’์œผ๋กœ๋Š” {constructor: ฦ’}๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

prototype์— ํ•ด๋‹น๋˜๋Š” value๋Š” ๊ฐ์ฒด์ž„์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜์‚ฌ ์ฝ”๋“œ๋กœ ์„ค๋ช…ํ•œ๋‹ค๋ฉด Foo = { prototype: {} }๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

prototype์˜ value๋กœ {}๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๊ทธ ๊ฐ์ฒด๋“ค์€ ์ž๋™์ ์œผ๋กœ key์™€ value๊ฐ€ ์„ค์ •๋˜์–ด์ ธ ์žˆ๋‹ค. ๋˜ํ•œ constructor์˜ value๋Š” ์ž๊ธฐ์ž์‹  Foo()๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Construct๋Š” .prototype ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  .prototype์€ Prototype์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค!(๋ชจ๋“ ํ•จ์ˆ˜ ๋‹ค ํฌํ•จ์ด ๊ฐ€๋Šฅํ•˜๋‹ค)

  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ์ž๋™์œผ๋กœ prototype์ด๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

  • ์ด prototype ์†์„ฑ์ด ๊ฐ–๊ณ  ์žˆ๋Š” value๋Š” ์–ด๋–ค ํ•˜๋‚˜์˜ prototype์ด๋ผ๋Š” ๋ถ€๋ฅด๋Š” ๊ฐ์ฒด์ด๋‹ค.

Prototype์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฐ์ฒด์—๋Š” ํ•ญ์ƒ ๋ฐ˜๋“œ์‹œ .construct๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง„๋‹ค.

console๋กœ ํ™•์ธํ•ด๋ณด์ž

Object๋ผ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

prtotype ํ™•์ธ
  • ์ด Object๋ผ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์—๋Š” .prototype์ด๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์ด .prototype์€ Prototype์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

prtotype ๊ฐ์ฒด์˜ constructor์†์„ฑ ํ™•์ธ
  • prototype์ด๋ผ๋Š” ๊ฐ์ฒด์—๋Š” constructor๋ผ๋Š” ์†์„ฑ์ด ์žˆ๋Š”๋ฐ ๊ทธ ์†์„ฑ์€ ์ƒ์„ฑ์žํ•จ์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

prtotype ๊ฐ์ฒด์˜ constructor์†์„ฑ ํ™•์ธ
  • constuctor์†์„ฑ์€ constructor๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

  • construct๋Š” ๋˜ prototype์ด๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง„๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด

์ƒ์„ฑ์žํ•จ์ˆ˜์™€ prototype์˜ ๊ด€๊ณ„
  • Constructor๋Š” .prototye์ด๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง„๋‹ค.

  • .prototype์†์„ฑ์€ Prototype์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง„๋‹ค.

  • Prototype๊ฐ์ฒด๋Š” .constructor๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

  • .constructor๋ผ๋Š” ์†์„ฑ์€ Constructor๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

  • Constructor๋Š” ๋‹ค์‹œ .prototype์ด๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

์ด๋กœ์จ Constroctor์™€ Prototype์€ .prototype๊ณผ .constructor ์†์„ฑ์€ ๊ฐ€์ง€๊ณ  ๊ทธ ์†์„ฑ์€ prototype์ด๋ผ๋Š” ๊ฐ์ฒด์™€ Constructor๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ๊ฐ€ ์„œ๋กœ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

๋‚จํŽธ๊ณผ ์•„๋‚ด๋กœ ๋น„์œ ํ•ด ๋ณด์ž ๐Ÿ’‘

์ƒ์„ฑ์žํ•จ์ˆ˜์™€ prototype์˜ ๊ด€๊ณ„

constructor๊ฐ€ ๋‚จํŽธ์ด ๋˜๊ณ  prototype์€ ์•„๋‚ด๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋‚จํŽธ๊ณผ ์•„๋‚ด๋ฅผ ๋ถ€๋ฅด๋Š” ๋ฐฉ๋ฒ•์„ ๋นจ๊ฐ„ ํ™”์‚ดํ‘œ๋Œ€๋กœ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ข€๋” ์‰ฝ๋‹ค!

๐ŸŒŸ์‹ค์ œ๋กœ ์ž‘์—…์„ ํ•  ๋•Œ์—” ์“ฐ์ง„ ์•Š๋Š”๋‹ค.

Instance ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ

(ํ•œ๊ฐ€์ง€์˜) ๊ฒฝ์šฐ

var obj = new Object();

new๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ์žํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•˜๋ฉด ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•ด์ค€๋‹ค. ์ƒ์„ฑ์žํ•จ์ˆ˜๋Š” ๋ฌด์กฐ๊ฑด this๋ฅผ returnํ•ด์ฃผ๊ณ  this๋Š” ๊ฐ์ฒด์ด๋‹ค.

new Object()๋ฅผ ํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ์ธ์Šคํ„ด์Šค๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋‘๋‘ฅ

function Foo() {}
var k = new Foo();

new Foo();๋ผ๋Š” ๊ฒƒ์€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ธ๋ฐ ์ด๊ฒƒ์€ Foo์˜ ์ธ์Šคํ„ด์Šค๋ผ๊ณ  ๋งํ•œ๋‹ค.

var a = new Array();
var b = new Array();

var a = [];
var b = [];

console.log(a === b) // false

์œ„์— ๋‘์ค„์ด ๋˜‘๊ฐ™๋‹ค๊ณ  ๋ง ํ•  ์ˆ˜์žˆ๋‹ค. ํ•˜์ง€๋งŒ a์™€ b๋Š” ๊ฐ™๋‹ค๊ณ  ํ•  ์ˆ˜ ์—†๋‹ค.

๋ฐฉ๊ธˆ์ „ ๋‚จํŽธ๊ณผ ์•„๋‚ด์— ๋น„์œ ๋ฅผ ํ•˜์˜€๋Š”๋ฐ instance๋Š” ๋‚จํŽธ๊ณผ ์•„๋‚ด์˜ ๊ฒฐ๊ณผ๋ฌผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

var obj = new Object();
  • ์—ฌ๊ธฐ์„œ ๋‚จํŽธ์€? Object๊ฐ€ ๋œ๋‹ค.

  • ์—ฌ๊ธฐ์„œ ์•„๋‚ด๋Š”? Object.prtotype์ด ๋œ๋‹ค.

function Foo() {}

var f = new Foo();
  • f๋Š” ์• ๊ธฐ๋‹ค.

  • Foo๊ฐ€ ์•„๋น ๊ฐ€ ๋œ๋‹ค.

  • Foo.prtotype์ด ์—„๋งˆ๊ฐ€ ๋œ๋‹ค.

Prototype chain! ๐Ÿ‘ฉโ€๐Ÿ‘ง

var obj = {};
  • ๋‚จํŽธ

    • Objec

  • ๋‚จํŽธ์˜ ์•„๋‚ด

    • Objec

  • ๊ทผ๋ฐ ์ž์‹์ด? constructor๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค?

    • Objec

.constructor๋Š” ์—„๋งˆ ์ฆ‰ Prototype์ด ๊ฐ€์ง€๋Š” ์†์„ฑ์ด ์˜€๋‹ค.

obj์—๊ฒ ์•„๋ฌด๊ฒƒ๋„ ํ• ๋‹นํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ constructor๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด๋‹ค.

์ด๊ฒŒ ๋ฌด์Šจ์ผ์ด๋ƒ???! ์ž์‹์ด ์—„๋งˆ์˜ ๋ฌผ๊ฑด์„ ์Šฌ์ฉํ•œ ์ƒํ™ฉ์ด๋‹ค.

์ž์‹์€ ์ผ๋‹จ ์ž์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•œ ํ›„! ์ฒดํฌ์ฒดํฌ -> ์—†๋‹ค๋ฉด ์—„๋งˆ๊ป„ ์Šฌ์ฉ ํ•œ๋‹ค.

var obj = {};

Object.prototype.haha = 123; // ์—„๋งˆ์—๊ฒŒ haha๋ผ๋Š” ์†์„ฑ์„ ์„ค์ •ํ•ด์คฌ๋‹ค.

console.log(obj.haha) // 123

obj์—๊ฒŒ haha๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์ง€ ์•Š์•˜๋Š”๋ฐ! haha๋ฅผ ๊ฐ€์ง! ๐Ÿ‘ฉโ€๐Ÿ‘ง

์ธ์Šคํ„ด์Šค(์ž์‹)๋Š” ์ž์‹ ์ด ๋ญ”๊ฐ€๋ฅผ ํ•„์š”๋กœ ํ•  ๋•Œ ๋จผ์ € ์–‘์‹ฌ๊ป ์ž์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ ํ•œ ํ›„ ์—†๋‹ค๋ฉด prototype(์—„๋งˆ)์—์„œ ์ฐพ๋Š”๋‹ค.

๊ทธ๋ฆผ์œผ๋กœ ํ™•์ธํ•œ๋‹ค๋ฉด

instance

Dunder Proto

proto ์ด๋ ‡๊ฒŒ ์ƒ๊ธด๊ฑธ Dunder Proto๋ผ๊ณ  ํ•œ๋‹ค.

Objec a ๋ผ๋Š” instance๋ฅผ ์ƒ์„ฑํ›„ a๋ฅผ console์— ์ฐ์–ด๋ณด๋ฉด {} ๋นˆ๊ฐ์ฒด๊ฐ€ ๋ณด์ธ๋‹ค. ๊ทธ ์•ˆ์„ ์—ด์–ด๋ณด๋ฉด Prototype(์—„๋งˆ)๊ฐ€ ๊ฐ€์ง€๋Š” ์†์„ฑ๊ณผ ๊ฐ’์ด ์žˆ๋‹ค! {constructior: Object} ์—„๋งˆ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด ๋†“์€ ๊ฒƒ์ด๋‹ค.

function Person (name) {
  this.name = name;
}

// Person === ๋‚จํŽธ
// Person.prototype === ๋‚จํŽธ์˜ ์•„๋‚ด

// ์•„์ด ์ƒ์„ฑ
var kennim = new Person('ken ken');

kennim.constructor === Person;
kennim.__proto__ === Person.prototype;

๋งˆ์ง€๋ง‰ 2์ค„์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž.

kennim.constructor === Person;

kennim์—๋Š” constructor๋ผ๋Š” ์†์„ฑ์ด ์—†๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์—„๋งˆ์ธ prototype์—์„œ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๊ณ , prototype์€ .constructor๋ผ๋Š”๊ฑธ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด .construct๋Š” ์•„๋น ๋ฅผ ๋ฐ”๋ผ๋ณธ๋‹ค. ์•„๋น ๋Š” Constructor๊ณ  ๊ทธ๊ฒƒ์€ Person์ด๊ธฐ ๋•Œ๋ฌธ์— true๋‹ค!

kennim.__proto__ === Person.prototype;

์•„๊นŒ ์œ„์—์„œ ๋ดค๋“ฏ์ด Dunder proto๋Š” Prototype์ด ๊ฐ€์ง„ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— true

var o = new Object();

o.costructor === Object();

o.constructor = function bar () {}

console.log(o.constructor === Object); // false;

o ์ธ์Šคํ„ด์Šค ์ž์‹์ด ๊ฐ€์ง„ constructor๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ์ฐพ๋Š”๋ฐ ๊ทธ๊ฒƒ์€ bar function ์ด๊ธฐ ๋•Œ๋ฌธ์— false๊ฐ€ ๋œ๋‹ค.

Dunder Proto
  • ์ž์‹์ด ์—„๋งˆ์—๊ฒŒ ์ ‘๊ทผํ•˜๊ณ ์ž ํ•  ๋•Œ Dunder proto๋กœ ํ•  ์ˆ˜ ์žˆ๊ธด ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

  • ์ €๊ฑธ ์“ฐ์—ฌ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์€ ์ฝ”๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ์งœ์—ฌ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ์ง€ ์ ‘๊ทผํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

์—„๋งˆ์•„๋น ๋„ ์—„๋งˆ์•„๋น ๊ฐ€ ์žˆ๋‹ค.

function Foo () {} // ์ƒ์„ฑ์žํ•จ์ˆ˜ - ์•„๋น 

console.log(Foo.prototype); // ์ƒ์„ฑ์žํ•จ์ˆ˜.prototype - ์—„๋งˆ

console.log(typeof Foo.prototype) // ๊ฐ์ฒด๋‹ค. ๊ฐ์ฒด๊ฐ€ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด ์ง€๋Š”๊ฐ€? new Object() ์ด๋ ‡๊ฒŒ๋‹ค.

// Foo.prototype ์–˜ ๋˜ํ•œ ๋ˆ„๊ตฐ๊ฐ€์˜ ์ž์‹์ด๋ž€ ๋ง์ด๋‹ค.

Foo.prototype ์–˜์˜ ์—„๋งˆ๋Š” ๋ˆ„๊ตด๊นŒ?**

Foo.prototype ๋˜ํ•œ ๊ฐ์ฒด instance๋‹ค. key์™€ value๋ฅผ ๊ฐ€์กŒ๋‹ค. ์•„๋น ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋‹ค Foo.prototype์˜ ์•„๋น ๋Š” ๋ˆ„๊ตฌ์ผ๊นŒ?

์–˜์—๊ฒŒ๋„ ์—„๋งˆ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง„ __proto__๊ฐ€ ์žˆ๋‹ค.

Dunder Proto ์—„๋งˆ์˜ ์ •๋ณด๊ฐ€ ๋‚˜์™”๋‹ค.

์ž ๊น Object.prototype์„ ํ™•์ธํ•˜์ž.

Dunder Proto ์ด ์ •๋ณด๋Š” Foo.prototype. proto ์™€ Object.proto์™€ ๋˜‘๊ฐ™๋‹ค.

์ด๋Ÿฌํ•œ ์ด์œ ๋Š” Foo.prototype๋„ new Object();๋กœ ๋งŒ๋“ค์–ด์ง„ ํ•˜๋‚˜์˜ intance์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Foo.prototype.proto === Object.prototype;

Foo.prototype.__proto__ === Object.prototype; // true;

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์—„๋งˆ์˜ ์—„๋งˆ์˜ ์ •๋ณด์ธ Foo.prototype. proto ์€ Object์˜ ์•„๋‚ด์ธ Object.prototype๊ณผ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๐Ÿคญ

Dunder Proto ์ง€๊ธˆ ์ ‘๊ทผํ•œ ์ƒํ™ฉ์„ ๊ทธ๋ฆผ์œผ๋กœ ๊ทธ๋ฆฌ๊ฒŒ ๋˜๋ฉด ์ด๋ ‡๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. (์ด๊ฒƒ์ด ๋งˆ์ง€๋ง‰ ๊ทธ๋ฆผ์ด๊ธธ ๋นˆ๋‹ค...)

  • ๋‚จํŽธ์€ Foo

  • ๋‚จํŽธ์˜ ์•„๋‚ด๋Š” Foo.prototype

  • ๋‚จํŽธ์˜ ์•„๋‚ด์˜ ์—„๋งˆ์˜ ์ •๋ณด๋Š” Foo.prototype. proto ๋กœ ์ ‘๊ทผ

  • ๋‚จํŽธ์˜ ์•„๋‚ด์˜ ์—„๋งˆ๋Š” ์‹ค์ œ Object.prototype ์ด๋‹ค. ์›Œํ›„ ๐Ÿคง

๊ทธ๋Ÿผ Object์˜ ์•„๋‚ด์˜ ์—„๋งˆ๋Š” ๋ˆ„๊ตด๊นŒ?

console.log(Object.prototype.__proto__) // null;

์‹œ์Šคํ…œ์ƒ null, Object์˜ ์•„๋‚ด๋Š”..์‘ฅ๊ณผ ๋งˆ๋Š˜์„..๋จน...(..)

๊ฐ€์กฑ๊ด€๊ณ„๋ฅผ ์ง์ ‘ํ™•์ธํ•ด๋ณด์ž

๊ฐ€์กฑ๊ด€๊ณ„ํŒŒ์•…์ด ๋๋‚˜๋‹ˆ ๋‹ค์‹œ ํ•œ๋ฒˆ ํ™•์ธํ•˜๊ณ ์ž ํ•˜๋Š” ์š•๊ตฌ๊ฐ€ ์ƒ๊ฒผ๋‹ค.

function Father() {}
var baby = new Father();

// __proto__๋ฅผ ์ด์šฉํ•ด ์—„๋งˆ์—๊ฒŒ ์ ‘๊ทผ
baby.__proto__ === Father.prototype; 

// ์—„๋งˆ(prototype)๊ฐ€ ๊ฐ€์ง„ constructor๋ฅผ ์ด์šฉํ•ด ์•„๋น ์—๊ฒŒ ์ ‘๊ทผ
baby.constructor === Father;

//__proto__ ๋กœ ํ• ๋จธ๋‹ˆ์—๊ฒŒ๋„ ์ ‘๊ทผ
baby.__proto__.__proto__ === Object.prototype;

//ํ• ๋จธ๋‹ˆ๊ฐ€ ๋งž๋Š”๊ฐ€?๋ฅผ ์—„๋งˆ๋กœ ์ฒดํฌํ•ด๋ณด๋ฉด false๊ฐ€ ๋‚˜์˜จ๋‹ค.
baby.__proto__ === Object.prototype;

prototype chain์€ ์ตœ์ข… Object๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ„๋‹ค

function Foo() {}
var f = new Foo();

Object.prototype.haha = 123;

console.log(f.haha); // 123

Inheritance(์ƒ์†)์ด ์•„๋‹ˆ๋ผ Behavior Delegation(ํ–‰๋™์„ ์œ„์ž„, ๋Œ€๋ฆฌ)์ด๋‹ค.

ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋ถ€ํƒ์„ ํ•˜๋Š”๊ฒƒ์ด์ง€ ์ƒ์† ๋ฐ›์€๊ฒŒ ์•„๋‹ˆ๋‹ค.

Last updated

Was this helpful?