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?