Prototype in Javascript - seowonintech/react-native-todo-list GitHub Wiki

javascript์—์„œ prototype์ด๋ž€?

์ด ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ Class ๊ธฐ๋ฐ˜ OOP ์–ธ์–ด๋ฅผ ๋‹ค๋ฃจ๋˜ ์‚ฌ๋žŒ์—๊ฒŒ๋Š” ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ๊ฐ€๋Š” ๋ถ€๋ถ„ ์ผ์ˆ˜๋„ ์žˆ๋‹ค. Class ๊ธฐ๋ฐ˜์˜ ์–ธ์–ด์—์„œ๋Š” Class ์•ˆ์— ๊ธฐ์ˆ ๋œ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” Class ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๊ฐ์ฒด์˜ ์›ํ˜•์ธ ํ”„๋กœํ† ํƒ€์ž…์„ ์ด์šฉํ•œ ํด๋กœ๋‹(Cloning: ๋ณต์‚ฌ)๊ณผ ๊ฐ์ฒดํŠน์„ฑ์„ ํ™•์žฅํ•ด ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ๋‚ธ๋‹ค.

  • Prototype์ด๋ผ๋Š” ์šฉ์–ด๋Š” ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.
    • Prototype Property
    • Prototype Link

Prototype Property : Prototype object. ์ž๊ธฐ ์ž์‹ ์„ Cloneํ•˜๋Š” ๊ฐ์ฒด๋“ค์ด ๊ฐ€์ง€๊ฒŒ๋  ์†์„ฑ๋“ค (์ž๊ธฐ ์ž์‹ ์˜ ๋ณต์‚ฌ๋ณธ???)

Prototype Link : ์ž๊ธฐ ์ž์‹ ์„ ๋งŒ๋“ค์–ด๋‚ธ ๊ฐ์ฒด์˜ ์›ํ˜•

Prototype Link

์–ด๋– ํ•œ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ธฐ ์œ„ํ•ด ๊ทธ ๊ฐ์ฒด์˜ ๋ชจํƒœ๊ฐ€ ๋˜๋Š” ๋…€์„์„ ํ”„๋กœํ† ํƒ€์ž…์ด๋ผ๊ณ  ํ•œ๋‹ค. Java๋‚˜ php์—์„œ ๋งํ•˜๋Š” class๊ฐ€ ๋ฐ”๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ”„๋กœํ† ํƒ€์ž…๊ณผ ๋™์ผํ•œ ์˜๋ฏธ์ผ ๊ฒƒ์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ๊ฐ์ฒด๋Š” ์ž์‹ ์„ ์ƒ์„ฑํ•œ ๊ฐ์ฒด ์›ํ˜•์— ๋Œ€ํ•œ ์ˆจ๊ฒจ์ง„ ์—ฐ๊ฒฐ์„ ๊ฐ–๋Š”๋‹ค. ์ด๋•Œ ์ž๊ธฐ ์ž์‹ ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ ๊ฐ์ฒด์›ํ˜•์„ ํ”„๋กœํ† ํƒ€์ž…์ด๋ž€ ํ•œ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ๊ฐ์ฒด๋Š” Object ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™•์žฅ ๋˜์—ˆ๊ธฐ๋•Œ๋ฌธ์— ์ด ์—ฐ๊ฒฐ์˜ ๋์€ Object ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… Object ๋‹ค.

function A() {};
var B = new A();

Prototype Property

๋ชจ๋“  ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ Constructor๋Š” prototype ์ด๋ž€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด prototype ํ”„๋กœํผํ‹ฐ๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋‹น์‹œ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฐ์ฒด ์ž์‹ ์˜ ์›ํ˜•์ด๋  prototype ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ฆ‰ ์ž์‹ ์„ ๋งŒ๋“  ์›ํ˜•์ด ์•„๋‹Œ ์ž์‹ ์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์งˆ ๊ฐ์ฒด๋“ค์ด ์›ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค. prototype object๋Š” default๋กœ empty Object ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

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

//#์˜ˆ์ œ 1.
var A = function () {
    this.x = function () {
         //do something
    };
};

//#์˜ˆ์ œ 2.
// ์—ฌ๊ธฐ์„œ A.prototype์„ Prototype Object๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋“ฏ
var A = function () { };
A.prototype.x = function () {
    //do something
};

prototype ํ”„๋กœํผํ‹ฐ๋Š” Constructor๊ฐ€ ๊ฐ€์ง€๋Š” ํ”„๋กœํผํ‹ฐ ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  *ํ•จ์ˆ˜๊ฐ์ฒด๋งŒ ์ด ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค

// ์˜๊ธฐ ์˜ˆ์ œ
var B = function A(){}
// var B = {} // syntax error
// var B = () => {} // syntax error
var C = new B();
console.log(B.__proto__); // [Function]
console.log(B.prototype); // A {}
console.log(C.prototype); // undefined

์ฐธ๊ณ ๋งํฌ

โš ๏ธ **GitHub.com Fallback** โš ๏ธ