์ด๋ฒ์ ํ์ฌ์์ ๋ฐฐ์น๋ฐ์ ํ์ ๋ชจ๋ฐ์ผ ์๋น์ค ํ์ด์๋ค.
๋ค์ดํฐ๋ธ ์ฑ ์๋์ ์น ๋ทฐ๋ฅผ ์ ๊ณตํ๋๋ฐ ๋น๋ถ๊ฐ์ ํ๋ก ํธ ๋ถ๋ถ์ ๋ค๋ฃจ๊ฒ ๋ ๊ฒ ๊ฐ๋ค.
JS๋ DOM ์กฐ์ ์ธ์๋ ๋ค๋ค๋ณผ ๊ธฐํ๊ฐ ์์๊ธฐ์ ์ด๋ฒ์ prototype์ ๋ํ ๊ฐ๋ ๋ ์ฒ์ ์๊ฒ ๋์๋ค.
JS๋ prototype ๊ธฐ๋ฐ ์ธ์ด๋ผ๊ณ ๋ถ๋ฆฐ๋ค๋๋ฐ ๊ธฐ๋ณธ๋ ๋ชฐ๋๋ ๊ฑฐ์์๋ค... ํ ๋์ JS๋ฅผ ์ด์ฌํ ๊ณต๋ถํด์ผํ ๊ฒ ๊ฐ๋ค.
prototype์ JS์์ ๊ฐ์ฒด์ ์์์ ๋ค๋ฃจ๋ ๊ฐ๋จํ๋ฉด์, ์ค์ํ ๊ฐ๋ ์ด์๋ค. ์ฌ์ค JS๋ ์ด๋ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค๋ ๊ฒ์ ๋๋ผ๊ธฐ๋ ํ๋ค.
๋ ์ญ์ JS๋ต๊ฒ ๊ต์ฅํ ์ฌํํ๋ค.
๐ง ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด ์์ฑ
function MyObject(์ธ์) {
this.property1 = ...
this.property2 = ์ธ์
}
class MyObject {
constructor(์ธ์) {
this.property1 = ...
this.property2 = ์ธ์
}
}
์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ์ ๋ ๊ฐ์ง ๋ฐฉ์์ธ๋ฐ ์๋ ๋ฐฉ์์ class๋ฅผ ๋ง๋๋ ๊ฒ์ SE6 ์ดํ์ ๋์จ ๋ฌธ๋ฒ์ด๋ผ๊ณ ํ๋ค.
๊ทธ๋์์ธ์ง ๋์ฒด๋ก function์ ์ฌ์ฉํ๋ ์ ๋ฐฉ๋ฒ์ผ๋ก ์์ฑ๋ ์ฝ๋๋ค์ด ๋๋ถ๋ถ์ธ ๋ฏํ๋ค.
๐ค ์๋ฐ์คํฌ๋ฆฝํธ prototype์ ์ด์ฉํ ์์
์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ์๋์ ์ผ๋ก prototype์ด๋ผ๋ property๊ฐ ์์ฑ๋๋ค.
์ด property์์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ๊ทธ๊ฒ์ด '๋ถ๋ชจ' ๊ฐ์ฒด๊ฐ ๋๋ฉด์ ์์์ด ์ผ์ด๋๋ค๊ณ ํ ์ ์๋ค.
function Papa(){
this.age = 50
}
function Son() {
this.name = 'son'
}
var sam = new Son()
sam.prototype = new Papa() // Son์ ๋คํ์ฑ ๊ฐ์ฒด์ธ sam์ Papa๊ฐ์ฒด๋ฅผ ๋ถ๋ชจ ๊ฐ์ฒด๋ก ์์ ๋ฐ๋๋ค.
console.log(sam.name) // >>> son
console.log(sam.age) // >>> 50
์ค์ ๋ก sam์ด๋ผ๋ ๊ฐ์ฒด๋ Son ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ age๋ผ๋ ์์ฑ์ ์์ง๋ง, prototype์ด๋ผ๋ ์์ฑ ์์ Papa๋ฅผ ์์ฑํ์ฌ ์์๋ฐ์๊ธฐ์ Papa๊ฐ ๊ฐ์ง๊ณ ์๋ age๋ผ๋ ์์ฑ์ ๊ฐ์ง๊ฒ ๋๋ค.
sam.protytpe.tall = 180
console.log(sam.tall) // >>> 180
์ ์ฒ๋ผ ๊ผญ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผํ๋ ๊ฒ์ด ์๋ prototype ์์ property๋ฅผ ์ถ๊ฐํ ์ ๋ ์๋ค.
ํ์คํ ๋ฌธ๋ฒ์ด ์์ ๋กญ๋ค.
๐ฅธ ์๋ฐ์คํฌ๋ฆฝํธ prototype chain
์ ์ฝ๋์์ ๋ณด๋ฏ์ด sam.age์ ๋์์ ์๋์ฒ๋ผ ์ด๋ค์ง๋ค.
sam ๊ฐ์ฒด์์ age ์์ฑ์ ์ฐพ์ -> ์์ -> prototype์์ ์ฐพ์ -> prototype์์ Papa ๊ฐ์ฒด์์ ์ฐพ์ -> ์ถ๋ ฅ
๋ง์ฝ, prototype ๊ฐ์ฒด์ Papa ๊ฐ์ฒด์๋ ์์๋ค๋ฉด, Papa ๊ฐ์ฒด ์์ prototype์์ ์ฐพ๊ธฐ๋ฅผ ๋ฐ๋ณตํ๋ค. -> ์ธ์ ๊น์ง? ์ต์์ ๊ฐ์ฒด๊น์ง
์ด๋ ๊ฒ prototype์ ์ฐ์์ ์ผ๋ก ์ฐพ๋๋ค ํ์ฌ ์ด๋ฅผ prototype chain์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค๊ณ ํ๋ค.
์๋ฐ๋ฅผ ๊ณต๋ถํ์๋ค๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ์ prototype์ ์ด๋ ต์ง ์๊ฒ ์ดํดํ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
์ด์ ๋์