๐ Class vs ProtoType
JavaScript
๋ ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ
์ ์ง์ ํ์ง๋ง Class
๋ฌธ๋ฒ์ ์ฌ์ฉํ์ง ์๊ณ ๋์ Prototype
๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ค. (ES6 ์ดํ์ class
๋ฌธ๋ฒ์ด ๋ค์ด์์ง๋ง ์ด๋ JS
๊ฐ class
๊ธฐ๋ฐ์ ๋ฌธ๋ฒ์ผ๋ก ๋ฐ๋ ๊ฒ์ ์๋๋ค.) ๊ทธ๋ ๋ค๋ฉด class
์ฒ๋ผ ์ฌ์ฉํ๋ ๋ฌธ๋ฒ๊ณผ prototype
๋ฌธ๋ฒ์ ์ธ์ ์ฌ์ฉํ ๊น? ๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
// use class
function myInfo() {
this.name = 'AYW'
this.age = 27
}
const myName = new myInfo();
const myAge = new myInfo();
console.log(myName.name); // AYW
console.log(myAge.age); // 27
// prototype
function myInfo() {}
myInfo.prototype.name = 'AYW';
myInfo.prototype.age = 27;
const myName = new myInfo();
const myAge = new myInfo();
console.log(myName.name); // AYW
console.log(myAge.age); // 27
์ฐจ์ด์ ์ด ๋๊ปด์ง๋๊ฐ? class
๋ฌธ๋ฒ์ ๋จ์ ์ myInfo
๋ด์ ์๋ ๊ฐ ๋ชจ๋๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๋ค๋ ๊ฒ์ด๋ค. ๊ฐ๋ น 100๊ฐ
์ ๊ฐ์ฒด๋ฅผ ์ ์ธํ๋ฉด 200๊ฐ
์ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ ๋ณ์์ ์ฌ๋ผ๊ฐ์๋ค๋ ๊ฒ์ด๋ค. ๋ง์ฝ, a
๋ณ์์๋ name
๊ณผ age
๋ชจ๋๋ฅผ ์ฌ์ฉํ์ง๋ง, b
๋ณ์์๋ name
๋ง ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ง ์๋ age
๋ณ์๊น์ง ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๋ค๋ ์ด์ผ๊ธฐ๋ค. ์ด๋ ๊ณง ๋ฉ๋ชจ๋ฆฌ์ ํจ์จ๊ณผ ๊ด๋ จ์ด ๋๋๋ฐ ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด prototype
์ ์ฌ์ฉํ๋ค.
prototype
์ ํจ์๋ฅผ ์ง์ ํ ๋ prototype
์ด๋ผ๋ ๊ณ ์ ์์ฑ ๊ฐ์ ์ง์ ํด์ค์ผ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋๋ง๋ค ํด๋น ๊ฐ์ฒด๋ ์ด๋ฏธ ์ง์ ๋ prototype
์ ์ํ ํจ์ ๊ฐ๋ง ์ฐธ์กฐํ๋ฉด ๋๋ ๊ฒ์ด๋ค. ์ฆ, prototype
์ ์ฐ๋ฉด 200๊ฐ์ ๋ณ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ ๊ฒ์ด ์๋๋ผ, ํจ์ซ๊ฐ๋ง ์ฐธ์กฐํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ์ฝ๋๋ ํจ๊ณผ๋ฅผ ์ป์ ์ ์๋ค. prototype
์ฝ๋์ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
prototype
์ ๋น ๊ฐ์ฒด๋ฅผ ์ด๋๊ฐ์ ์ ์ธํ๋ค.myName
๊ณผmyAge
๋prototype
์ ๋น ๊ฐ์ฒด ๋ด์ ์กด์ฌํ๋Object
์ ๊ฐ์ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ค.- ์ฝ๊ฒ ๋งํด
name
๊ณผage
๋ฅผprototype
์ ๋น ๊ฐ์ฒด ์ด๋๊ฐ์ ๋ฃ์ด๋๊ณmyName
๊ณผmyAge
๋ณ์๊ฐ ํด๋น ๊ฐ์ ๊บผ๋ด์ฐ๋ ํํ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
- ์ฝ๊ฒ ๋งํด
์ง๊ธ๊น์ง ๋ด์ฉ์ผ๋ก ๋ณด์ prototype
์ ์ง์ ํจ์๋ด๋ถ์ ์ ์ธํ์ง๋ ์์ ๊ฐ์ ๋ฃ์ด๋ ์ ์๋ค๊ณ ๋ฐฐ์ ๋ค. ๊ทธ๋ผ ์ด๋ป๊ฒ ๊ฐ์ ์ ์ฅํ๊ณ ์ ๊ทผํ๋ค๋ ๋ง์ธ๊ฐ? ํด๋ต์ prototype Object
์ prototype Link
์ ์๋๋ฐ, ํ๋์ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ์ดํด๋ณด์.
๐ ProtoType Object(constructor), ProtoType Link
๊ฐ์ฒด๋ ์ธ์ ๋ ํจ์(Function)
๋ก ์์ฑ๋๋ค. ํจ์๋ก ์ ์๋๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ป๋ ์๊ฒฉ์ด ์๋๋ฐ ๋ฐ๋ก constructor(์์ฑ์)
๋ค. ์ด๊ฒ์ด ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ new
๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ ๊ฒ์ด๋ค.
๋, ํจ์๋ฅผ ์์ฑํ๋ฉด prototype
์ ์์ฑ(property)๊ณผ ProtoType Object
๊ฐ ๋ง๋ค์ด์ง๋๋ฐ, ์์ฑ๋ ํจ์์ prototype
์ ์์ฑ์ ํตํด ProtoType Object
์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ด ์๊ธด๋ค. ProtoType Object
๋ ๋ง ๊ทธ๋๋ก ํ๋กํ ํ์
๊ฐ์ฒด์ด๊ณ , ์ดํดํ๊ธฐ ์ฝ๊ฒ ์ผ๋ฐ ๊ฐ์ฒด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. ์ผ๋ฐ ๊ฐ์ฒด์๋ ๊ฐ์ ์์ ๋กญ๊ฒ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ์ ์๋ค.
[myInfo ํจ์๋ constructor(์์ฑ์)๋ฅผ ๊ฐ๊ณ ์๋ค]
[prototype object์ ๊ฐ์ ์ถ๊ฐํ๋ ๋ชจ์ต]
prototype_object
๋ constructor(์์ฑ์)
์ __proto__
์์ฑ์ ๊ฐ๊ฒ ๋๋ค. constructor(์์ฑ์)
๋ ์์ฑ ํจ์์ธ function myInfo() {}
๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค.
๊ทธ๋ ๋ค๋ฉด __proto__
์์ฑ์ ๋ญ๊น? ์ฐ๋ฆฌ๊ฐ ํจ์ ๋ด๋ถ์ ๊ฐ์ ์ ์ธํ์ง ์์๋๋ฐ๋ ์ ๊ทผํ ์ ์๋ ์ด์ ๊ฐ ๋ฐ๋ก __proto__
๋๋ฌธ์ด๋ค. __proto__
๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ origin
๊ฒฉ์ ํจ์์ธ prototype object
๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ์ฆ, name
๊ณผ age
๋ myInfo
๋ก๋ถํฐ ์์ฑ๋์์ผ๋ myInfo
ํจ์์ prototype object
๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋๋ค. ์ด์ฒ๋ผ __proto__
์์ฑ์ ํตํด ์์ ํ๋กํ ํ์
๊ณผ ์ฐ๊ฒฐ๋์ด์๋ ํํ๋ฅผ ํ๋กํ ํ์
์ฒด์ธ(prototype chain)
์ด๋ผ๊ณ ํ๋ค.
// prototype chain1
function myInfo() {} // ํจ์
myInfo.prototype.name = 'AYW'
myInfo.prototype.age = 27
let an = new myInfo(); // ํจ์๋ฅผ ๊ฐ์ฒด๋ก ์์ฑ
console.log(an.name) // 'AYW'
console.log(an.age) // 27
prototype chain
์ ๋ ๋ค๋ฅธ ์๋ฅผ ํ๋ฒ ์ดํด๋ณด์.
// prototype chain2
function Boss (){}
Boss.prototype.boolean = true;
function MiddleBoss (){}
MiddleBoss.prototype = new Boss();
function Worker(){}
Worker.prototype = new MiddleBoss();
let o = new Worker();
console.log(o.boolean) // true
์ด ๊ณผ์ ์ Boss
-> MiddleBoss
-> Worker
์์ผ๋ก boolean
๊ฐ์ ๋ด๋ ค์ฃผ๋ ์ฝ๋์ด๋ค. ์ด ์ฝ๋๊ฐ ์ด๋ป๊ฒ o.boolean
๊ฐ์ด true
๊ฐ ๋์ฌ ์ ์์๊น?
- ๋ง์ง๋ง ๋ณ์์ธ
o
์property
์คboolean
๊ฐ์ด ์๋์ง ์ดํด๋ณด๊ณ ์์ผ๋ฉด ๋ฐํ์ํจ๋ค. - ๊ฐ์ด ์์ผ๋ฉด ์์ฑ์๋ฅผ ์ถ์ ํ๋ค. ์์
prototype
์ธWorker
์property
์์Worker.prototype.boolean
์ ์ฐพ๊ณ ์์ผ๋ฉด ๋ฐํ์ํจ๋ค. - ๊ฐ์ด ์์ผ๋ฉด ์์ฑ์๋ฅผ ์ถ์ ํ๋ค. ์์
prototype
์ธMiddleBoss
์property
์์MiddleBoss.prototype.boolean
์ฐพ๊ณ ์์ผ๋ฉด ๋ฐํ์ํจ๋ค. - ๊ฐ์ด ์์ผ๋ฉด ์์ฑ์๋ฅผ ์ถ์ ํ๋ค. ์์
prototype
์ธBoss
์property
์์Boss.prototype.boolean
์ฐพ๊ณ ์์ผ๋ฉด ๋ฐํ์ํจ๋ค.
์ด๋ฐ ์์๋ก ์งํ ๋ ๊ฒ์ด๋ค. ๋ง์ฝ, ๋ค์ ์ฝ๋๋ ๊ฐ์ด ์ด๋ป๊ฒ ๋์ฌ๊น?
// prototype chain3
function Boss (){}
Boss.prototype.boolean = true;
function MiddleBoss (){}
MiddleBoss.prototype = new Boss();
function Worker(){}
let t = new Worker();
t.boolean = false;
Worker.prototype. = t
let o = new Worker();
console.log(o.boolean) // ??
์ ๋ต์ false๋ค. ์ ๊ทธ๋ด๊น?
- ๋ง์ง๋ง ๋ณ์์ธ
o
์property
์คboolean
๊ฐ์ด ์๋์ง ์ดํด๋ณด๊ณ ์์ผ๋ฉด ๋ฐํ์ํจ๋ค. - ๊ฐ์ด ์์ผ๋ฉด ์์ฑ์๋ฅผ ์ถ์ ํ๋ค. ์์
Worker.prototype
๋ฅผ ์ดํ๋ค. prototype
์ ์ ์ฅ๋์ด์๋boolean
๊ฐ์ด4
์ด๊ธฐ ๋๋ฌธ์4
๋ฅผ ๋ฐํํ๋ค.
๐ reference
๋๊ธ