prototype

์›ํ˜• (์›๋ž˜์˜ ํ˜•ํƒœ) prototype์„ ์ด์šฉํ•˜์—ฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ƒ์†๊ฐœ๋…์„ ์ œ๊ณต

(prototype chain)

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); //true

๋จผ์ € ์ƒ์„ฑ์ž ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฉด, ์ƒ์„ฑ์ž๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜์ด๋‹ค. ํ˜ธ์ถœํ•  ๋•Œ ํ•จ์ˆ˜์•ž์— new๋ฅผ ๋ถ™์ด๋ฉด์„œ ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ƒ์„ฑ์ž๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋˜๊ณ  ๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ทธ ๊ฐ์ฒด๋ฅผ returnํ•˜๊ณ  o๋ผ๋Š” ๋ณ€์ˆ˜์— ๋‹ด๊ธด๋‹ค.

o๋ผ๋Š” ๋ณ€์ˆ˜์•ˆ์—๋Š” ์ƒ์„ฑ์ž๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๊ฐ€ o ์•ˆ์— ๋“ค์–ด์žˆ๋‹ค.

var o = {}

์ด๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๊ณ  ์ƒ์„ฑ์ž๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ์ด์œ ๋Š”.. ? ์šฐ๋ฆฌ๊ฐ€ ์–ด๋– ํ•œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ, ๊ทธ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š” ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋กœ์ง์ด ํ•„์š”ํ•œ๊ฑฐ์ง€, {} ๋น„์–ด์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ๊ฒŒ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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

๊ทธ๋Ÿผ, ์šฐ๋ฆฌ๊ฐ€ ์–ป๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด์˜ ์›ํ˜•, ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค๋ฉ”์†Œ๋“œ์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋Š” prototype ์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ์— ์ด ๊ณณ์— ๋‹ด๊ธด๋‹ค. Sub๋Š” ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  ๊ทธ ํ”„๋กœํผํ‹ฐ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์•ฝ์†๋œ prototype๋ฅผ ์“ฐ๋Š”๋ฐ ์ด ์•ˆ์—” ๊ฐ์ฒด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.

var o = new Sub();

๊ทธ๋Ÿผ new๋ฅผ ์ด์šฉํ•ด์„œ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด, ์ƒ์„ฑ์ž ํ•จ์ˆ˜ Sub์˜ prototype ์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด์„œ ๊ทธ๊ฒƒ์„ returnํ•ด์ค€๋‹ค.

function func(){};

console.log(func.prototype); //func {}

func.pototype.name = 'egoing';

var o = new func();

console.log(o); //func {name: 'sla'};

์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋ฉด prototype์— ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฆฌํ„ด์ด ๋œ๋‹ค.

prototype chain

function Ultra(){};
Ultra.prototype.ultraProp = true;

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

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

var o = new Sub();
o.ultraProp = 1;
console.log(o.ultraProp); // 1

์ œ์ผ ์ฒ˜์Œ o๋ผ๋Š” ๊ฐ์ฒด์— ํ”„๋กœํผํ‹ฐ๋กœ ultraProp๊ฐ€ ์žˆ๋Š”์ง€ ์ฐพ๋Š”๋‹ค.

function Ultra(){};
Ultra.prototype.ultraProp = true;

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

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

var o = new Sub();
console.log(o.ultraProp); // 2

o์— property๋กœ ultraProp๊ฐ€ ์—†์œผ๋ฏ€๋กœ Sub๋กœ ์˜ฌ๋ผ๊ฐ€ 2๊ฐ€ ๊ฐ’์ด ๋œ๋‹ค.

function Ultra(){};
Ultra.prototype.ultraProp = true;

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

function Sub(){};
var s = new Super();
s.ultraProp = 3;
Sub.prototype = s;

var o = new Sub();
console.log(o.ultraProp); // 3

o์—๋„ ์—†๊ณ  ๊ทธ๋Ÿผ Sub์˜ prototype์„ ๋’ค์ง€๋Š”๋ฐ Sub์˜ prototype์œผ๋กœ new Super() ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๊ทธ ๊ฐ์ฒด์˜ ultraProp = 3์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ 3์ด ๋„์ถœ๋œ๋‹ค.

function Ultra(){};
Ultra.prototype.ultraProp = true;

function Super(){};
var t = new Ultra();
t.ultraProp = 4;
Super.prototype = t;

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

var o = new Sub();

console.log(o.ultraProp); //4
function Ultra(){};
Ultra.prototype.ultraProp = true;

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

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

var o = new Sub();

console.log(o.ultraProp); // true

ultraProp๋ฅผ ์ฐพ๊ธฐ์œ„ํ•ด ๊ณ„์† ์ฒด์ธ์ฒ˜๋Ÿผ ์˜ฌ๋ผ๊ฐ„๋‹ค.

function Sub(){}
//Sub.prototype = new Super(); ์ƒ์†๋ฐ›๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์•ผํ•˜๋Š”๋ฐ 

  // ์ƒ์†๋ฐ›๊ณ ์žํ•˜๋Š” property๋ฅผ ๋„ฃ๋Š”๋‹ค๋ฉด ๋ถ€๋ชจ ๊ฐ์ฒด๊นŒ์ง€ ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค.
Sub.prototype = Super.prototype

Sub์—๋งŒ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ถ”๊ฐ€ ๋˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ. Super์— ๊นŒ์ง€ ์ถ”๊ฐ€๋˜์–ด์„œ ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค.

์–ด๋– ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์†๋ฐ›๊ณ ์ž ํ•œ๋‹ค๋ฉด ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ž

Last updated

Was this helpful?