D+53
- Prototype Chain -
(prototype, __ proto__, constructor์ ๊ด๊ณ
Object.create(), class์ super)
prototype, __proto__, constructor์ ๊ด๊ณ
prototype
๋ชจ๋ ํจ์์๋ ํ๋กํ ํ์ ์ด๋ผ๋ ์์ฑ์ด ์กด์ฌํ๋๋ฐ,
์ด๋ก ์ธํด์ ์ฐ๋ฆฌ๋ prototype์ ํตํด์ ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์๋ค.
๋ํ prototype์ ๊ฐ์ ์์ฑ์๋ก๋ถํฐ ๋ง๋ค์ด์ง ์ธ์คํด์ค ๊ฐ์ฒด๋ค์ prototype์ ํตํด ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๋ค.
๋ํ ์ฐ๋ฆฌ๊ฐ MDN์ ํตํด์ ๋ฉ์๋๋ฅผ ๊ฒ์ํ ๊ฒฝ์ฐ ํญ์ ์ ๋ ๊ฒ prototype์ด ๋ถ์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋๋ฐ
์ด๋ ํจ์์ ์ํ์ ๋ถ์ด์๋ ๋ฉ์๋์ด๊ธฐ ๋๋ฌธ์ prototype์ด ๋ถ์ด ์๋ ๊ฒ์ด๋ผ๊ณ ํ ์ ์๋ค.
__proto__
prototype์ ๋ํด์ ์์๋ณด์์๋ ๊ถ๊ธํ ๊ฒ์ด ์๊ฒผ์ ๊ฒ์ด๋ค.
๋ฐ๋ก ์ __proto__๋ ๋ฌด์์ ๋ํ๋ด๋ ๊ฒ์ผ๊น์ ๋ํ ๊ถ๊ธ์ฆ ๋ง์ด๋ค.
__proto__์ ํ๋กํ ํ์ ์ฒด์ธ์ผ๋ก ์ฐ๊ฒฐ๋ ๋ถ๋ชจ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒ์ผ๋ก,
์์ ์ด๋ฏธ์ง์์๋ func์ ๋ถ๋ชจ๊ฐ์ฒด๋ Object๋ผ๋ ๊ฒ์ ์๋ ค์ค๋ค.
constructor
constructor์ ์์ฑ์๋ผ๋ ์๋ฏธ๋ก ์ธ์คํด์ค๊ฐ ์ด๊ธฐํ๋ ๋ ์คํํ๋ ์์ฑ์ ํจ์์ด๋ค.
Object.create()
var Human = function(name) {
this.name = name;
}
Human.prototype.sleep = function() {};
var steve = new Human('steve');
var Student = function(name) {
}
Student.prototype.learn = function() {};
var john = new Student('john');
john.learn();
john.sleep(); // ??????????
Human์ sleep์ด๋ผ๋ ๋ฉ์๋๋ฅผ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๊ณ Student๋ learn์ด๋ผ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ด๋, Human์ steve๋ผ๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ์๊ณ
Student์๋ john์ด๋ผ๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ์๋ค.
์ฌ๊ธฐ์ john์ Student์ learn๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋๋ฐ
์ด๋ ๋ง์ฝ Human์ sleep ๋ฉ์๋๋ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
์ด๋๋ Student๊ฐ Human์ ์ฐธ์กฐํด์ผ ํ๋ฏ๋ก ์ฐธ์กฐํ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ค์ผ ํ๋๋ฐ
๊ทธ๊ฒ์ด ๋ฐ๋ก Object.create()์ด๋ค.
1) Object.create()
Student.prototype = Object.create(Human.prototype);
Student.prototype.learn = function() {};
Object.create()๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณต์ฌํ ํ๋กํ ํ์ ์ Object.create๋ฅผ ์ฌ์ฉํด ์ฃผ๋ฉด ๋๋๋ฐ
์ด๋ Object.create() ๊ดํธ ์์๋ ๋ณต์ฌํ ํ๋กํ ํ์ ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
์ฐ๋ฆฌ๋ Student์ Human์ ๋ณต์ฌํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์ ํด๋น ์ฝ๋์ฒ๋ผ ์ ๋ ฅํด ์ฃผ๋ฉด ๋๋ค.
2) ์์ฑ์์ ์ค์์ฑ
1๋ฒ๊น์ง ์งํ์ ํด์ฃผ๋ฉด Human์ ์ฐธ์กฐํ ์ ์์ง๋ง ํ ๊ฐ์ง ์ค๋ฅ๊ฐ ์๋ค.
์๋๋ผ๋ฉด student1์ ๋ถ๋ชจ ๊ฐ์ฒด ์์ฑ์๋ Student๊ฐ ๋์์ผ ํ์ง๋ง
์ด์ํ๊ฒ๋ Human์ด ๋์๋ฒ๋ฆฐ๋ค.
์ด๋ ์ฐ๋ฆฌ๊ฐ Object.create()๋ฅผ ํตํด Human์ ๋ณต์ฌํด๋ฒ๋ฆฌ๋ฉด์ ์์ฑ์๋ ๊ฐ์ ธ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ ๊ฒ์ธ๋ฐ
์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ Student.prototype์ ์์ฑ์๊ฐ Student๋ผ๋ ๊ฒ์ ์๋ ค์ฃผ๋ฉด ๋๋ค.
Student.prototype.constructor = Student;
๋ฐ๋์ด์ง ๊ฒ์ ํ์ธํ ์ ์๋ค.
3) context ์ ๋ฌ
2๋ฒ๊น์ง ์งํํด์ฃผ์๋ค๊ณ ๋๋ ๊ฒ์ด ์๋๋ค.
newํค์๋๋ฅผ ์ฌ์ฉํด ์ธ์คํด์ค๋ฅผ ์์ฑํด์คฌ์ ๋ Human์ผ๋ก context๊ฐ ์ ๋ฌ์ด ์๋์ด ๋ฒ๋ฆฐ๋ค.
์ด๋์ ์ฐ๋ฆฌ๋ call์ ์ฌ์ฉํด ์ค์ Human์ผ๋ก ๊น์ง ์ ์ ๋ฌ๋ ์ ์๋๋ก ํด์ฃผ๋ฉด ๋๋ค.
class์ super
๋ฐฉ๊ธ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ฝ๋๋ pseudoclassical ํ ๋ฐฉ๋ฒ์ผ๋ก ์ ์ํ ์ฝ๋์ด๋ค.
ํ์ง๋ง ์ด๋ฌํ ๋ฐฉ๋ฒ์ ๊ฐ๋ ์ ์ดํดํ๊ธฐ ์ํด ์ฌ์ฉ๋์ง ํ์์ ์ ์ฌ์ฉ๋์ง ์๋๋ค.
์ฐ๋ฆฌ๋ ํด๋์ค ๋ฐฉ์์ ์ฌ์ฉํด ๋์ฑ ์ฝ๊ณ ๊ฐ๋จํ๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋๊ฐ ์ ์๋ค.
๊ธฐ์กด์ ์ฌ์ฉํ ํค์๋์์ class๋ก ๋ณ๊ฒฝํด์ฃผ๊ณ
์์ฑ์๋ ๋ฐ๋ก ํด์ค ํ์ ์์ด Human ํด๋์ค ์์๋ค๊ฐ constructor๋ฅผ ์ฌ์ฉํด ์ ๋ ฅํด ์ฃผ๋ฉด ๋๋ค.
๋ํ Student ํด๋์ค๊ฐ Human์ ์์๋ฐ๊ธฐ ์ํด์ extends๋ง์ ์ ๋ ฅํด ์ฃผ๋ฉด ๋๊ณ
๋ฌผ๋ ค๋ฐ์ name์ ๊ดํ ์ ๋ณด๋ super๋ฅผ ์ด์ฉํด ์ฃผ๋ฉด ํจ์ฌ ๊ฐ๋จํ์ง๋ง
๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ ์ฝ๋๊ฐ ์์ฑ๋๋ค.
'์๋ > Code-States' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[D+55] ๋ค์๊ณต๋ถํ๋ค... DOM.... (0) | 2020.10.31 |
---|---|
[D+54] ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ 1๋ฒ (0) | 2020.10.30 |
[D+52] ๊ฐ์ฒด์งํฅ ์ธ์ด (OOP) (0) | 2020.10.28 |
[D+51] ์๊ฐ๋ณต์ก๋์ Big-o ํ๊ธฐ๋ฒ (0) | 2020.10.27 |
[D+50] Graph, Tree, BST (Binary Search Tree) (0) | 2020.10.26 |
๋๊ธ