ํฐ์คํ ๋ฆฌ ๋ทฐ
[JavaScript] ํ๋กํ ํ์
๊ฐ๋ฐ๊ฐ๊ตด๐ธ 2022. 7. 24. 18:52์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ช ๋ นํ, ํจ์ํ, ํ๋กํ ํ์ ๊ธฐ๋ฐ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ๋ ๋ฉํฐ ํจ๋ฌ๋ค์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋๋ค. C++๋ ์๋ฐ์ ๊ฐ์ ํด๋์ค ๊ธฐ๋ฐ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ณด๋ค ํจ์จ์ ์ด๋ฉฐ ๋ ๊ฐ๋ ฅํ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ๋ฅ๋ ฅ์ ์ง๋๊ณ ์์ต๋๋ค.
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ก๊ทธ๋๋ฐ์ ๋ช ๋ น์ด ๋๋ ํจ์์ ๋ชฉ๋ก์ผ๋ก ๋ณด๋ ์ ํต์ ์ธ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ์ ์ ์ฐจ์งํฅ์ ๊ด์ ์์ ๋ฒ์ด๋ ์ฌ๋ฌ ๊ฐ์ ๋ ๋ฆฝ์ ๋จ์, ์ฆ ๊ฐ์ฒด์ ์งํฉ์ผ๋ก ํ๋ก๊ทธ๋จ์ ํํํ๋ ค๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๋๋ค.
// ์ด๋ฆ๊ณผ ์ฃผ์ ์์ฑ์ ๊ฐ๋ ๊ฐ์ฒด
const person = {
name: 'Lee',
address: 'Seoul'
};
const circle = {
radius: 5,
getDiameter() {
return 2 * radius;
}
};
์ค์ธ๊ณ์ ์ค์ฒด(์ฌ๋ฌผ์ด๋ ๊ฐ๋ )๋ ํน์ง์ด๋ ์ฑ์ง์ ๋ํ๋ด๋ ์์ฑ์ ํตํด ์ค์ฒด๋ฅผ ์ธ์ํ๊ฑฐ๋ ๊ตฌ๋ณํ ์ ์๋๋ฐ, ์์ ์์ person์ฒ๋ผ ์ด๋ฌํ ๋ฐฉ์์ ํ๋ก๊ทธ๋๋ฐ์ ์ ๋ชฉ์์ผ *์ถ์ํ๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ํํํ ์ ์์ต๋๋ค.
๋ํ, ์์ ์์ circle์ฒ๋ผ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ํ๋ด๋ ๋ฐ์ดํฐ์ ์ํ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ ์ ์๋ ๋์์ ํ๋์ ๋ ผ๋ฆฌ์ ์ธ ๋จ์๋ก ๋ฌถ์ด์ ์๊ฐํฉ๋๋ค.
๋ฐ๋ผ์, ๊ฐ์ฒด๋ ์ํ ๋ฐ์ดํฐ(์์ฑ)๊ณผ ๋์์ ํ๋์ ๋ ผ๋ฆฌ์ ์ธ ๋จ์๋ก ๋ฌถ์ ๋ณตํฉ์ ์ธ ์๋ฃ๊ตฌ์กฐ๋ผ๊ณ ํ ์ ์์ต๋๋ค. ๊ฐ์ฒด๋ ์์ ์ ๊ณ ์ ๊ธฐ๋ฅ์ ์ํํ๋ฉด์ ๋ค๋ฅธ ๊ฐ์ฒด์ ๊ด๊ณ์ฑ์ ๊ฐ์ง๋๋ค.
*์ถ์ํ : ๋ค์ํ ์์ฑ ์ค์์ ํ๋ก๊ทธ๋จ์ ํ์ํ ์์ฑ๋ง ๊ฐ์ถ๋ ค ๋ด์ด ํํํ๋ ๊ฒ
์์๊ณผ ํ๋กํ ํ์
์์์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ๊ฐ๋ ์ผ๋ก, ์ด๋ค ๊ฐ์ฒด์ ํ๋กํผํฐ ๋๋ ๋ฉ์๋๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์์๋ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ๋งํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ๋กํ ํ์ ๊ธฐ๋ฐ์ผ๋ก ์์์ ๊ตฌํํด ๋ถํ์ํ ์ค๋ณต์ ์ ๊ฑฐํฉ๋๋ค.
// ์์ฑ์ ํจ์
function Cricle(radius) {
this.radius = radius;
}
// Circle ์์ฑ์ ํจ์๊ฐ ์์ฑํ ๋ชจ๋ ์ธ์คํด์ค๊ฐ getArea ๋ฉ์๋๋ฅผ ๊ณต์ ํด์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋กํ ํ์
์ ์ถ๊ฐ
// ํ๋กํ ํ์
์ Circle ์์ฑ์ ํจ์์ prototype ํ๋กํผํฐ์ ๋ฐ์ธ๋ฉ๋์ด ์์
Circle prototype.getArea = function () {
return Math.PI * this.radius ** 2;
};
// ์ธ์คํด์ค ์์ฑ
const circlel1 = new Circle(1);
const circlel2 = new Circle(2);
// Circle ์์ฑ์ ํจ์๊ฐ ์์ฑํ ๋ชจ๋ ์ธ์คํด์ค๋ ๋ถ๋ชจ ๊ฐ์ฒด์ ์ญํ ์ ํ๋ ํ๋กํ ํ์
์์ getArea ๋ฉ์๋๋ฅผ ์์๋ฐ์
// ์ฆ, Circle ์์ฑ์ ํจ์๊ฐ ์์ฑํ๋ ๋ชจ๋ ์ธ์คํด์ค๋ ํ๋์ getArea ๋ฉ์๋๋ฅผ ๊ณต์ ํจ
console.log(circle1.getArea == circle2.getArea); // true
console.log(circle1.getArea()); // 3.14...
console.log(circle1.getArea()); // 12.56...
- Circle ์์ฑ์ ํจ์๊ฐ ์์ฑํ ๋ชจ๋ ์ธ์คํด์ค๋ ์์ ์ ํ๋กํ ํ์ , ์ฆ ์์(๋ถ๋ชจ) ๊ฐ์ฒด ์ญํ ์ ํ๋ Circle.prototype์ ๋ชจ๋ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์์๋ฐ์
- getArea ๋ฉ์๋๋ ๋จ ํ๋๋ง ์์ฑ๋์ด ํ๋กํฌํ์ ์ธ Circle.prototype์ ๋ฉ์๋์ ํ ๋น๋์ด ์์
- ๋ฐ๋ผ์ Circle ์์ฑ์ ํจ์๊ฐ ์์ฑํ๋ ๋ชจ๋ ์ธ์คํด์ค๋ getArea ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ฌ์ฉํ ์ ์์
- ์ฆ, ์์ ์ ์ํ๋ฅผ ๋ํ๋ด๋ radius ํ๋กํผํฐ๋ง ๊ฐ๋ณ์ ์ผ๋ก ์์ ํ๊ณ getArea๋ ์์์ ํตํด ๊ณต์ ํด์ ์ฌ์ฉ
์์ ์์ ์ ๊ฐ์ด ์์์ ์ฝ๋์ ์ฌ์ฌ์ฉ์ด๋ ๊ด์ ์์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์์ฑ์ ํจ์๊ฐ ์์ฑํ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ํ๋กํ ํ์ ์ ๋ฏธ๋ฆฌ ๊ตฌํํด ๋๋ฉด ์์ฑ์ ํจ์๊ฐ ์์ฑํ ๋ชจ๋ ์ธ์คํด์ค๋ ๋ณ๋์ ๊ตฌํ์์ด ์์(๋ถ๋ชจ) ๊ฐ์ฒด์ธ ํ๋กํ ํ์ ์ ์์ฐ์ ๊ณต์ ํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ๋กํ ํ์ ๊ฐ์ฒด
ํ๋กํ ํ์ ๊ฐ์ฒด๋ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๊ทผ๊ฐ์ ์ด๋ฃจ๋ ๊ฐ์ฒด ๊ฐ ์์์ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋๋ฐ, ์ด๋ค ๊ฐ์ฒด์ ์์(๋ถ๋ชจ)๊ฐ์ฒด์ ์ญํ ์ ํ๋ ๊ฐ์ฒด๋ก์ ๋ค๋ฅธ ๊ฐ์ฒด์ ๊ณต์ ํ๋กํฐํผ๋ฅผ ์ ๊ณตํ๋ ์ญํ ์ ํฉ๋๋ค.
- ๋ชจ๋ ๊ฐ์ฒด๋ [[Prototype]] ๋ด๋ถ ์ฌ๋กฏ์ ๊ฐ์ง
- ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ ๊ฐ์ฒด ์์ฑ ๋ฐฉ์์ ๋ฐ๋ผ ํ๋กํ ํ์ ์ด ๊ฒฐ์ ๋๊ณ [[Prototype]]์ ์ ์ฅ๋จ
- ๊ฐ์ฒด๋ [[Prototype]] ๋ด๋ถ ์ฌ๋กฏ์ ์ง์ ์ ๊ธํ ์ ์์ง๋ง ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํจ
__proto__ ์ ๊ทผ์ ํ๋กํผํฐ
๋ชจ๋ ๊ฐ์ฒด๋ __proto__ ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํด ์์ ์ ํ๋กํ ํ์ , ์ฆ [[Prototype]] ๋ด๋ถ ์ฌ๋กฏ์ ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผํ ์ ์์ต๋๋ค.
์์ ์์ ์ ๊ฐ์ด person ๊ฐ์ฒด์ ํ๋กํ ํ์ ์ด ๊ตฌ์ฑ๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
- __proto__๋ ์ ๊ทผ์ ํ๋กํผํฐ์ด๊ธฐ ๋๋ฌธ์ ์์ฒด์ ์ผ๋ก๋ ๊ฐ์ ๊ฐ์ง ์๊ณ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๊ฐ์ ์ฝ๊ฑฐ๋ ์ ์ฅํ ๋ ์ฌ์ฉํ๋ ์ ๊ทผ์ ํจ์, ์ฆ [[Get]], [[Set]] ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- __proto__ ๋ ๊ฐ์ฒด๊ฐ ์ง์ ์์ ํ๋ ํ๋กํผํฐ๊ฐ ์๋๋ผ ๋ชจ๋ ๊ฐ์ฒด๋ ์์์ ํตํด Object.prototype.__proto__์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- __proto__ ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํด ํ๋กํ ํ์ ์ ์ ๊ทผํ๋ ์ด์ ๋ ์ํธ ์ฐธ์กฐ์ ์ํด ํ๋กํฌํ์ ์ฒด์ธ์ด ์์ฑ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด์์ ๋๋ค. ํ๋กํ ํ์ ์ฒด์ธ์ ๋จ๋ฐฉํฅ ๋งํฌ๋ ๋ฆฌ์คํธ๋ก ๊ตฌํ๋์ด์ผ ํ๋กํ ํ์ ์ ๊ฒ์ํ ๋ ์ํ ์ฐธ์กฐ์ ์ํด ๋ฌดํ ๋ฃจํ์ ๋น ์ง๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ __proto__ ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํด ํ๋กํ ํ์ ์ ์ ๊ทผํ๊ณ ๊ต์ฒดํ๋๋ก ๊ตฌํํด, ์๋์ ๊ฐ์ ์ํฉ์ด ์๊ฒผ์๋ ์๋ฌ๋ฅผ ๋ฐ์์ํต๋๋ค.
const parent = {};
const child = {};
// child์ ํ๋กํ ํ์
์ parent๋ก ์ค์
child.__proto__ parent;
// parent๋ก ํ๋กํ ํ์
์ child์ ์ค์
parent.__protp__ child; // TypeError
- __proto__ ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ์ฝ๋ ๋ด์์ ์ง์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค. ๋ชจ๋ ๊ฐ์ฒด๊ฐ __proto__ ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ ํ๋กํ ํ์ ์ ์ฐธ์กฐ๋ฅผ ์ทจ๋ํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ Obejct.getPrototypeOf ๋ฉ์๋ ์ฌ์ฉ์ ํ๊ณ , ํ๋กํ ํ์ ๊ต์ฒด ํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ Obejct.setPrototypeOf ๋ฉ์๋ ์ฌ์ฉ์ด ๊ถ์ฅ๋ฉ๋๋ค.
ํจ์ ๊ฐ์ฒด์ proototype ํ๋กํผํฐ
ํจ์ ๊ฐ์ฒด๋ง์ด ์์ ํ๋ proototype ํ๋กํผํฐ๋ ์์ฑ์ ํจ์๊ฐ ์์ฑํ ๋ ๊ฐ์ฒด(์ธ์คํด์ค)์ ํ๋กํ ํ์ ์ ๊ฐ๋ฅดํต๋๋ค.
// ํจ์ ๊ฐ์ฒด๋ prototype ํ๋กํผํฐ๋ฅผ ์์
(function () {}).hasOwnProperty('prototype'); // true
// ์ผ๋ฐ ๊ฐ์ฒด๋ prototype ํ๋กํผํฐ๋ฅผ ์์ X
({}).hasOwnProperty('prototype'); // false
๋ชจ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋(Object.proototype์ผ๋ก๋ถํฐ ์์๋ฐ์) __proto__ ์ ๊ทผ์ ํ๋กํผํฐ์ ํจ์ ๊ฐ์ฒด๋ง์ด ๊ฐ์ง๊ณ ์๋ proototype ํ๋กํผํฐ๋ ๊ฒฐ๊ตญ ๋์ผํ ํ๋กํ ํ์ ์ ๊ฐํค์ง๋ง, ์ด๋ค ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ ์ฃผ์ฒด๋ ์๋์ ๊ฐ์ด ๋ค๋ฆ ๋๋ค.
๊ตฌ๋ถ | ์์ | ๊ฐ | ์ฌ์ฉ ์ฃผ์ฒด | ์ฌ์ฉ ๋ชฉ์ |
__proto__ ์ ๊ทผ์ ํ๋กํผํฐ | ๋ชจ๋ ๊ฐ์ฒด | ํ๋กํ ํ์ ์ ์ฐธ์กฐ | ๋ชจ๋ ๊ฐ์ฒด | ๊ฐ์ฒด๊ฐ ์์ ์ ํ๋กํ ํ์ ์ ์ ๊ทผ ๋๋ ๊ต์ฒดํ๊ธฐ ์ํด ์ฌ์ฉ |
proototype ํ๋กํผํฐ | constructor | ํ๋กํ ํ์ ์ ์ฐธ์กฐ | ์์ฑ์ ํจ์ | ์์ฑ์ ํจ์๊ฐ ์์ ์ด ์์ฑํ ๊ฐ์ฒด(์ธ์คํด์ค)์ ํ๋กํ ํ์ ์ ํ ๋นํ๊ธฐ ์ํด ์ฌ์ฉ |
ํ๋กํ ํ์ ์ constructor ํ๋กํผํฐ์ ์์ฑ์ ํจ์
๋ชจ๋ ํ๋กํ ํ์ ์ constructor ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๋๋ค. ์์ฑ์ ํจ์๊ฐ ์์ฑ๋ ๋, ์ฆ ํจ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ constructor ํ๋กํผํฐ๋ proototype ํ๋กํผํฐ๋ก ์์ ์ ์ฐธ์กฐํ๊ณ ์๋ ์์ฑ์ ํจ์๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
// ์์ฑ์ ํจ์
function Person(name){
this.name = name;
}
const me = new Person('Lee');
// me ๊ฐ์ฒด์ ์์ฑ์ ํจ์๋ Person
console.log(me.constructor === Person); // true
์ ์์ ๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ฐ๊ฒฐ์ด ์ด๋ฃจ์ด์ ธ me ๊ฐ์ฒด๋ ํ๋กํ ํ์ ์ Person.prototype์ constructor ํ๋กํผํฐ๋ฅผ ์์๋ฐ์ ์ฌ์ฉํ ์ ์๊ฒ๋ฉ๋๋ค.
๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ์ ์ํด ์์ฑ๋ ๊ฐ์ฒด์ ์์ฑ์ ํจ์์ ํ๋กํ ํ์
์์ฑ์ ํจ์์ ์ํด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ ์ด์ธ์ ๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ์ ์ํ ๊ฐ์ฒด ์์ฑ๋ฐฉ์๋ ์กด์ฌํฉ๋๋ค.
// ๊ฐ์ฒด ๋ฆฌํฐ๋ด
const obj = {};
// ํจ์ ๋ฆฌํฐ๋ด
const add = function (a,b) { return a + b; };
// ๋ฐฐ์ด ๋ฆฌํฐ๋ด
const arr = [1, 2, 3];
// ์ ๊ท ํํ์ ๋ฆฌํฐ๋ด
const regexp = /is/ig;
ํ๋กํ ํ์ ๊ณผ ์์ฑ์ ํจ์๋ ๋จ๋ ์ผ๋ก ์กด์ฌํ ์ ์๊ณ ์ธ์ ๋ ์์ผ๋ก ์กด์ฌํฉ๋๋ค. ๋ฐ๋ผ์ ์์ ์์ ์ ๊ฐ์ด ๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ์ ์ํด ๊ฐ์ฒด๋ฅผ ์์ฑํด๋ ์์ฑ์ ํจ์์ ํ๋กํ ํ์ ์ด ์กด์ฌํฉ๋๋ค.
๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ์ ์ํด ์์ฑ๋ ๊ฐ์ฒด์ ์์ฑ์ ํจ์์ ํ๋กํ ํ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ | ์์ฑ์ ํจ์ | ํ๋กํ ํ์ |
๊ฐ์ฒด ๋ฆฌํฐ๋ด | Obejct | Object.prototype |
ํจ์ ๋ฆฌํฐ๋ด | Function | Function.prototype |
๋ฐฐ์ด ๋ฆฌํฐ๋ด | Array | Array.prototype |
์ ๊ท ํํ์ ๋ฆฌํฐ๋ด | RegExp | RegExp.prototype |
constructor ํ๋กํผํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์์ฑ์ ํจ์๊ฐ ๋ฐ๋์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์์ฑ์ ํจ์๋ผ๊ณ ๋จ์ ์ง์ ์๋ ์์ต๋๋ค. ํ์ง๋ง, ์์ฑ ๊ณผ์ ์์ ๋ฏธ๋ฌํ ์ฐจ์ด๋ง ์์๋ฟ ๊ฒฐ๊ตญ ๊ฐ์ฒด๋ก์ ๋์ผํ ํน์ฑ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ํ๋กํ ํ์ ์ contstructor ํ๋กํผํฐ๋ฅผ ํตํด ์ฐ๊ฒฐ๋์ด ์๋ ์์ฑ์ ํจ์๋ฅผ ๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ์ผ๋ก ์์ฑํ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์์ฑ์ ํจ์๋ก ์๊ฐํด๋ ํฌ๊ฒ ๋ฌด๋ฆฌ๊ฐ ์์ต๋๋ค.
ํ๋กํ ํ์ ์ ์์ฑ ์์
ํ๋กํ ํ์ ๊ณผ ์์ฑ์ ํจ์๋ ๋จ๋ ์ผ๋ก ์กด์ฌํ ์ ์๊ณ ์ธ์ ๋ ์์ผ๋ก ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ํ๋กํ ํ์ ์ ์์ฑ์ ํจ์๊ฐ ์์ฑ๋๋ ์์ ์ ๋๋ถ์ด ์์ฑ๋ฉ๋๋ค. ์์ฑ์ ํจ์๋ ์๋์ ๊ฐ์ด ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ์ ์ ์์ฑ์ ํจ์ : ์ฌ์ฉ์๊ฐ ์ง์ ์ ์ํ ์์ฑ์ ํจ์
- ๋นํธ์ธ ์์ฑ์ ํจ์ : ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ์์ฑ์ ํจ์
์ฌ์ฉ์ ์ ์ ์์ฑ์ ํจ์์ ํ๋กํ ํ์ ์์ฑ ์์
์์ฑ์ ํจ์๋ก์ ํธ์ถํ ์ ์๋ ํจ์, ์ฆ constructor๋ ํจ์ ์ ์๊ฐ ํ๊ฐ๋์ด ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์์ ์ ํ๋กํ ํ์ ๋ ๋๋ถ์ด ์์ฑ๋ฉ๋๋ค.
// ํจ์ ์ ์(constructor)๊ฐ ํ๊ฐ๋์ด ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์์ ์ ํ๋กํ ํ์
์ด ์์ฑ
// ํจ์ ํธ์ด์คํ
: ํจ์ ์ ์ธ๋ฌธ์ ๋ฐํ์ ์ด์ ์ ์๋ฐ์คํฌ๋ฆฝํธ์์ง์ ์ํด ๋จผ์ ์คํ๋จ
console.log(Person1.prototype); // {constructor: f}
// ์์ฑ์ ํจ์
function Person1(name) {
this.name = name;
}
// ํ์ดํ ํจ์๋ non-constructor
const Person2 = name => {
this.name = name;
}
console.log(Person2.prototype); // undefined
์ด์ฒ๋ผ ์ฌ์ฉ์ ์ ์ ์์ฑ์ ํจ์๋ ์์ ์ด ํ๊ฐ๋์ด ํจ์ ๊ฐ์ฒด๋ก ์์ฑ๋๋ ์์ ์ ํ๋กํ ํ์ ๋ ๋๋ถ์ด ์์ฑ๋๋ฉฐ, ์์ฑ๋ ํ๋กํ ํ์ ์ ํ๋กํ ํ์ ์ ์ธ์ ๋ Object.prototype์ ๋๋ค.
๋นํธ์ธ ์์ฑ์ ํจ์์ ํ๋กํ ํ์ ์์ฑ ์์
Object, String, Number, Function, Array, RegExp, Date, Promise ๋ฑ๊ณผ ๊ฐ์ ๋นํธ์ธ ์์ฑ์ ํจ์๋ ์ผ๋ฐ ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋นํธ์ธ ์์ฑ์ ํจ์๊ฐ ์์ฑ๋๋ ์์ ์ ํ๋กํ ํ์ ์ด ์์ฑ๋ฉ๋๋ค. ๋ชจ๋ ๋นํธ์ธ ์์ฑ์ ํจ์๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ์์ ์ ์์ฑ๋์ด ์์ฑ๋ ํ๋กํ ํ์ ์ ๋นํธ์ธ ์์ฑ์ ํจ์์ prototype ํ๋กํผํฐ์ ๋ฐ์ธ๋ฉ๋ฉ๋๋ค.
์ด์ฒ๋ผ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ธฐ ์ด์ ์ ์์ฑ์ ํจ์์ ํ๋กํ ํ์ ์ ์ด๋ฏธ ๊ฐ์ฒดํ๋์ด ์กด์ฌํฉ๋๋ค. ์ดํ ์์ฑ์ ํจ์ ๋๋ ๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ํ๋กํ ํ์ ์ ์์ฑ๋ ๊ฐ์ฒด์ [[Prototype]] ๋ด๋ถ ์ฌ๋กฏ์ ํ ๋น๋์ด ๊ฐ์ฒด๋ ํ๋กํ ํ์ ์ ์์๋ฐ์ต๋๋ค.
๊ฐ์ฒด ์์ฑ ๋ฐฉ์๊ณผ ํ๋กํ ํ์ ์ ๊ฒฐ์
๊ฐ์ฒด๋ ๊ฐ์ฒด๋ฆฌํฐ๋ด, Object ์์ฑ์ ํจ์, ์์ฑ์ ํจ์, Object.create๋ฉ์๋, ํด๋์ค์ ๊ฐ์ด ๋ค์ํ ์์ฑ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๊ฐ ๋ฐฉ์๋ง๋ค ๊ฐ์ฒด ์์ฑ ๋ฐฉ์์ ์ฐจ์ด๋ ์์ผ๋ *์ถ์ ์ฐ์ฐ OrdinaryObejctCreate์ ์ํด ์์ฑ๋๋ค๋ ๊ณตํต์ ์ด ์์ต๋๋ค.
*์ถ์ ์ฐ์ฐ : ECMAScript ์ฌ์์์ ๋ด๋ถ ๋์์ ๊ตฌํ ์๊ณ ๋ฆฌ์ฆ์ ํํํ ๊ฒ
์ฆ, ํ๋กํ ํ์ ์ ์ถ์ ์ฐ์ฐ OrdinaryObejctCreate์ ์ ๋ฌ๋๋ ์ธ์์ ์ํด ๊ฒฐ์ ๋๊ณ ์ด ์ธ์๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ์์ ์ ๊ฐ์ฒด ์์ฑ ๋ฐฉ์์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค.
- ๊ฐ์ฒด ๋ฆฌํฐ๋ด : ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ด ํ๊ฐ ๋๋ฉด ์ถ์ ์ฐ์ฐ์ ์ํด Object ์์ฑ์ ํจ์์ Object.prototype๊ณผ ์์ฑ๋ ๊ฐ์ฒด ์ฌ์ด์ ์ฐ๊ฒฐ์ด ๋ง๋ค์ด์ง๊ณ ๊ฐ์ฒด ๋ฆฌํฐ๋ด ๋ด๋ถ์ ํ๋กํผํฐ๊ฐ ์ถ๊ฐ๋จ
const obj = { x: 1 };
- Object ์์ฑ์ ํจ์ : ์ผ๋จ ๋น ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ถ์ ์ฐ์ฐ์ ์ํด Object ์์ฑ์ ํจ์์ Object.prototype๊ณผ ์์ฑ๋ ๊ฐ์ฒด ์ฌ์ด์ ์ฐ๊ฒฐ์ด ๋ง๋ค์ด์ง๊ณ ์ดํ Object ์์ฑ์ ํจ์๊ฐ ํธ์ถ๋ ๋ ํ๋กํผํฐ๊ฐ ์ถ๊ฐ๋จ
const obj = new Obejct();
obj.x = 1;
- ์์ฑ์ ํจ์ : new ์ฐ์ฐ์์ ํจ๊ป ์์ฑ์ ํจ์๋ฅผ ํธ์ถํ์ฌ ์ถ์ ์ฐ์ฐ์ ์ํด ์์ฑ์ ํจ์์ ์์ฑ์ ํจ์์ prototype ํ๋กํฐํผ์ ๋ฐ์ธ๋ฉ๋์ด ์๋ ๊ฐ์ฒด์ ์์ฑ๋ ๊ฐ์ฒด ์ฌ์ด์ ์ฐ๊ฒฐ์ด ๋ง๋ค์ด์ง
function Person(name) {
this.name = name;
}
const me = new Person('Lee');
ํ๋กํ ํ์ ์ฒด์ธ
ํ๋กํ ํ์ ์ฒด์ธ์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์์์ ๊ตฌํํ๋ ๋งค์ปค๋์ฆ์ ๋๋ค.
function Person(name) {
this.name = name;
}
// ํ๋กํ ํ์
๋ฉ์๋
Person.prototype.sayHello = function () {
console.log(`Hi my name is ${this.name}`);
};
const me = new Person('Lee');
//hasOwnProperty๋ Object.prototype์ ๋ฉ์๋
console.log(me.hasOwnProperty('name')); // true
Object.getPrototypeOf(me) === Person.prototype; // true
Object.getPrototypeOf(Person.prototype) === Object.prototype; // true
์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ ํ๋กํผํฐ์ ์ ๊ทผํ๋ ค๊ณ ํ ๋ ํด๋น ๊ฐ์ฒด์ ์ ๊ทผํ๋ ค๋ ํ๋กํผํฐ๊ฐ ์๋ค๋ฉด [[Prototype]] ๋ด๋ถ ์ฌ๋กฏ์ ์ฐธ์กฐ๋ฅผ ๋ฐ๋ผ ์์ ์ ๋ถ๋ชจ ์ญํ ์ ํ๋ ํ๋กํ ํ์ ์ ํ๋กํผํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ๊ฒ์ํ๋๋ฐ ์ด๋ฅผ ํ๋กํ ํ์ ์ฒด์ธ์ด๋ผ๊ณ ํฉ๋๋ค.
ํ๋กํ ํ์ ์ฒด์ธ์ ์ต์์์ ์์นํ๋ ๊ฐ์ฒด๋ ์ธ์ ๋ Object.prototype์ด๊ธฐ ๋๋ฌธ์ ์ด๋ ํ๋กํฌํ์ ์ฒด์ธ์ ์ข ์ ์ ๋๋ค. ์ฆ, Object.prototype์ ํ๋กํ ํ์ ์ธ [[Prototype]] ๋ด๋ถ ์ฌ๋กฏ์ ๊ฐ์ null ์ ๋๋ค.
์ด์ฒ๋ผ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํ๋กํ ํ์ ์ฒด์ธ์ ๋ฐ๋ผ ํ๋กํผํฐ/๋ฉ์๋๋ฅผ ๊ฒ์ํ๊ธฐ ๋๋ฌธ์ ํ๋กํฌํ์ ์ฒด์ธ์ ์์๊ณผ ํ๋กํผํฐ ๊ฒ์์ ์ํ ๋ฉ์ปค๋์ฆ์ด๋ผ ํ ์ ์์ต๋๋ค.
** ์ค์ฝํ ์ฒด์ธ๊ณผ ํ๋กํ ํ์ ์ฒด์ธ์ ์๋ก ํ๋ ฅํ์ฌ ์๋ณ์์ ํ๋กํผํฐ๋ฅผ ๊ฒ์ํ๋๋ฐ ์ฌ์ฉ๋จ
์ค๋ฒ๋ผ์ด๋ฉ๊ณผ ํ๋กํผํฐ ์๋์
์์ ๊ด๊ณ์ ์ํด ํ๋กํผํฐ๊ฐ ๊ฐ๋ ค์ง๋ ํ์์ ํ๋กํผํฐ ์๋์์ด๋ผ ํฉ๋๋ค.
const Person = (function () {
// ์์ฑ์ ํจ์
function Person(name) {
this.name = name;
}
// ํ๋กํ ํ์
๋ฉ์๋
Person.prototype.sayHello = function () {
console.log(`Hi my name is ${this.name}`);
};
// ์์ฑ์ ํจ์๋ฅผ ๋ฐํ
return Person;
}());
const me = new Person('Lee');
// ์ธ์คํด์ค ๋ฉ์๋
me.sayHello = function () {
console.log(`Hey my name is ${this.name}`);
};
// ์ธ์คํด์ค ๋ฉ์๋๊ฐ ํธ์ถ. ํ๋กํ ํ์
์ ๋ฉ์๋๋ ์ธ์คํด์ค ๋ฉ์๋์ ์ํด ๊ฐ๋ ค์ง
me.sayHello(); // Hey! my name is Lee
์ ์์ ์ฒ๋ผ ํ๋กํ ํ์ ํ๋กํผํฐ์ ๊ฐ์ ์ด๋ฆ์ ํ๋กํผํฐ๋ฅผ ์ธ์คํด์ค์ ์ถ๊ฐํ๊ฒ ๋๋ฉด ํ๋กํ ํ์ ์ฒด์ธ์ ๋ฐ๋ผ ํ๋กํ ํ์ ํ๋กํผํฐ๋ฅผ ๊ฒ์ํ์ฌ ํ๋กํ ํ์ ํ๋กํผํฐ๋ฅผ ๋ฎ์ด์ฐ๋ ๊ฒ์ด ์๋๋ผ ์ธ์คํด์ค ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ธ์คํด์ค ๋ฉ์๋ sayHello๋ ํ๋กํ ํ์ ๋ฉ์๋ sayHello๋ฅผ *์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ํ๋กํ ํ์ ๋ฉ์๋ sayHello๋ ๊ฐ๋ ค์ง๋๋ฐ ์ด๋ฐ ํ์์ด ํ๋กํผํฐ ์๋์์ ๋๋ค.
*์ค๋ฒ๋ผ์ด๋ฉ : ์์ ํด๋์ค๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฉ์๋๋ฅผ ํ์ ํด๋์ค๊ฐ ์ฌ์ ์ํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ์
*์ค๋ฒ๋ก๋ฉ : ํจ์์ ์ด๋ฆ์ ๋์ผํ์ง๋ง ๋งค๊ฐ๋ณ์์ ํ์ ๋๋ ๊ฐ์๊ฐ ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ๊ตฌํํ๊ณ ๋งค๊ฐ๋ณ์์ ์ํด ๋ฉ์๋๋ฅผ
๊ตฌ๋ณํ์ฌ ํธ์ถํ๋ ๋ฐฉ์
์ด์ฒ๋ผ, ์ญ์ ์์๋ ํ๋กํผํฐ ์๋์์ด ์ผ์ด๋ ์ธ์คํด์ค์ ๋ฉ์๋๋ ์ญ์ ๊ฐ๋ฅํ์ง๋ง ํ๋กํ ํ์ ์ ๋ฉ์๋๋ ๋ณ๊ฒฝ/์ญ์ ๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
ํ๋กํ ํ์ ์ ๊ต์ฒด
ํ๋กํ ํ์ ์ ์์์ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ๋ณ๊ฒฝํ ์ ์์ด ๋ถ๋ชจ ๊ฐ์ฒด์ธ ํ๋กํ ํ์ ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํด ๊ฐ์ฒด ๊ฐ์ ์์ ๊ด๊ณ๋ฅผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์์ฑ์ ํจ์์ ์ํ ํ๋กํ ํ์ ๊ต์ฒด
์์ฑ์ ํจ์์ prototype ํ๋กํผํฐ๋ฅผ ํตํด ํ๋กํ ํ์ ์ ๊ต์ฒดํ ์ ์์ต๋๋ค.
const Person = (function () {
function Person(name) {
this.name = name;
}
// ์์ฑ์ ํจ์์ prototype ํ๋กํผํฐ๋ฅผ ํตํด ํ๋กํ ํ์
์ ๊ต์ฒด
Person.prototype = {
sayHello() {
console.log(`Hi my name is ${this.name}`);
}
};
return Person;
}());
const me = new Person('Lee');
// constructor ํ๋กํผํฐ์ ์์ฑ์ ํจ์ ๊ฐ์ ์ฐ๊ฒฐ์ด ํ๊ดด๋จ
console.log(me.constructor === Person); // false
console.log(me.constructor === Object); // true
์ ์์ ์ฒ๋ผ Person.prototype์ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ํ ๋นํด ํ๋กํฌํ์ ์ ๊ต์ฒดํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ me ๊ฐ์ฒด์ ์์ฑ์ ํจ์๋ฅผ ๊ฒ์ํ๋ฉด Person์ด ์๋๋ผ Object๊ฐ ๋์ค๊ฒ ๋ฉ๋๋ค.
์ธ์คํด์ค์ ์ํ ํ๋กํ ํ์ ๊ต์ฒด
์ธ์คํด์ค์ __proto__ ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํด ํ๋กํ ํ์ ์ ๊ต์ฒดํ ์ ์์ต๋๋ค.
function Person(name) {
this.name = name;
}
const me = new Person('Lee');
// ํ๋กํ ํ์
์ผ๋ก ๊ต์ฒดํ ๊ฐ์ฒด
const parent = {
sayHello() {
console.log(`Hi my name is ${this.name}`);
}
};
Object.setPrototypeOf(me, parent); // me.__proto__ = parent; ์ ๊ฐ์
// constructor ํ๋กํผํฐ์ ์์ฑ์ ํจ์ ๊ฐ์ ์ฐ๊ฒฐ์ด ํ๊ดด๋จ
console.log(me.constructor === Person); // false
console.log(me.constructor === Object); // true
์ ์์ ์ฒ๋ผ __proto__ ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํด ์ด๋ฏธ ์์ฑ๋ ๊ฐ์ฒด parent์ ํ๋กํ ํ์ ์ผ๋ก ๊ต์ฒดํ ์ ์์ต๋๋ค.
*์์ฑ์ ํจ์์ ์ธ์คํด์ค์ ์ํด ๊ฐ์ฒด ๊ฐ์ ์์ ๊ด๊ณ๋ฅผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋กญ๊ธฐ ๋๋ฌธ์ ์ง์ ๊ต์ฒดํ๊ธฐ ๋ณด๋ค๋ "์ง์ ์์"์ ์ด์ฉํ๋ ๊ฒ์ด ๋ ํธ๋ฆฌํ๊ณ ์์ ํฉ๋๋ค.
instanceof ์ฐ์ฐ์
์์ฑ์ ํจ์์ prototype์ ๋ฐ์ธ๋ฉ๋ ๊ฐ์ฒด๊ฐ ํ๋กํ ํ์ ์ฒด์ธ ์์ ์กด์ฌํ๋์ง ํ์ธํ๋ ์ฐ์ฐ์๋ก ์๋์ฒ๋ผ ํํํฉ๋๋ค.
๊ฐ์ฒด instanceof ์์ฑ์ ํจ์
instanceof ์ฐ์ฐ์๋ ์ฐ๋ณ์ ์์ฑ์ ํจ์์ prototype์ ๋ฐ์ธ๋ฉ๋ ๊ฐ์ฒด๊ฐ ์ข๋ณ ๊ฐ์ฒด์ ํ๋กํ ํ์ ์ฒด์ธ ์์ ์กด์ฌํ๋ฉด true๋ก ํ๊ฐ๋๊ณ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์ false๋ก ํ๊ฐ๋๋ ์ดํญ ์ฐ์ฐ์์ ๋๋ค.
function Person(name) {
this.name = name;
}
const me = new Person('Lee');
// Person.prototype๊ณผ Object.prototype์ด me ๊ฐ์ฒด์ ํ๋กํ ํ์
์ฒด์ธ ์์ ์กด์ฌํจ
console.log(me instanceof Person); // true
console.log(me instanceof Object); // true
// ํ๋กํ ํ์
์ผ๋ก ๊ต์ฒดํ ๊ฐ์ฒด
const parent = {};
// ํ๋กํ ํ์
๊ต์ฒด
Obejct.setPrototypeOf(me, parent);
// Person ์์ฑ์ ํจ์์ parent ๊ฐ์ฒด๋ ์ฐ๊ฒฐX
console.log(Person.prototype === parent); // false
console.log(parent.constructor === Person); // false
// parent ๊ฐ์ฒด๋ฅผ Person ์์ฑ์ ํจ์์ prototype ํ๋กํผํฐ์ ๋ฐ์ธ๋ฉ
Person.prototype = parent;
console.log(me instanceof Person); // true
console.log(me instanceof Object); // true
์ ์์ ๋ฅผ ์ดํด๋ณด๋ฉด instanceof ์ฐ์ฐ์๋ ํ๋กํ ํ์ ์ constructor ํ๋กํผํฐ๊ฐ ๊ฐ๋ฅดํค๋ ์์ฑ์ ํจ์๋ฅผ ์ฐพ๋ ๊ฒ์ด ์๋๋ผ ์์ฑ์ ํจ์์ prototype์ ๋ฐ์ธ๋ฉ๋ me ๊ฐ์ฒด๊ฐ Person๊ณผ Obejct์ ํ๋กํ ํ์ ์ฒด์ธ ์์ ์กด์ฌํ๋์ง ํ์ธํฉ๋๋ค.
์ง์ ์์
Object.create์ ์ํ ์ง์ ์์
๋ค๋ฅธ ๊ฐ์ฒด ์์ฑ ๋ฐฉ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ถ์ ์ฐ์ฐ์ ํตํด ๋ช ์์ ์ผ๋ก ํ๋กํ ํ์ ์ ์ง์ ํ์ฌ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
Object.create(prototype,[propertiesObject])
- prototype : ์์ฑํ ๊ฐ์ฒด์ ํ๋กํ ํ์ ์ผ๋ก ์ง์ ํ ๊ฐ์ฒด. ์ฒซ ๋ฒ์ฌ ๋งค๊ฐ๋ณ์๋ ํ์
- [propertiesObject] : ์์ฑํ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ๊ฐ๋ ๊ฐ์ฒด. ๋ ๋ฒ์งธ ์ธ์๋ ์ต์
- ๋ฐํ๊ฐ : ์ง์ ๋ ํ๋กํ ํ์ ๋ฐ ํ๋กํผํฐ๋ฅผ ๊ฐ๋ ์๋ก์ด ๊ฐ์ฒด
// obj -> Object.prototype -> null
let obj = Object.create(Object.prototype);
console.log(Object.getPrototypeOf(obj) === Object.prototype); // true
const myProto = { x: 10 };
// ์์์ ๊ฐ์ฒด๋ฅผ ์ง์ ์์๋ฐ๋๋ค.
// obj -> myProto -> Object.prototype -> null
obj = Object.create(myProto);
console.log(obj.x); // 10
console.log(Object.getPrototypeOf(obj) === myProto); // true
// ์์ฑ์ ํจ์
function Person(name) {
this.name = name;
}
// obj -> Person.prototype -> Object.prototype -> null
obj = Object.create(Person.prototype);
obj.name = 'Lee';
console.log(obj.name); // Lee
console.log(Object.getPrototypeOf(obj) === Person.prototype); // true
์ด์ฒ๋ผ Object.create ๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด์ ์ง์ ์ ์ผ๋ก ์์์ ๊ตฌํํ๋ ๊ฒ์ผ๋ก ์๋์ ๊ฐ์ ์ฅ์ ์ด ์์ต๋๋ค.
- new ์ฐ์ฐ์๊ฐ ์์ด๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์์
- ํ๋กํ ํ์ ์ ์ง์ ํจ๋ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์์
- ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์ํด ์์ฑ๋ ๊ฐ์ฒด๋ ์์๋ฐ์ ์ ์์
๊ฐ์ฒด ๋ฆฌํฐ๋ด ๋ด๋ถ์์ __proto__ ์ ์ํ ์ง์ ์์
ES6์์๋ ๊ฐ์ฒด ๋ฆฌํฐ๋ด ๋ด๋ถ์์ __proto__ ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ ์์์ ๊ตฌํํ ์ ์์ต๋๋ค.
const myProto = { x : 10 };
const obj = {
y: 20,
// ๊ฐ์ฒด๋ฅผ ์ง์ ์์๋ฐ์
// obj -> myProto -> Object.prototype -> null
__proto__: myProto
};
console.log(obj.x, obj.y); // 10, 20
console.log(Object.getPrototypeOf(obj) === myProto); // true
๋ฐ๋ผ์ Object.create ๋ฉ์๋์์ ๋ ๋ฒ์งธ ์ธ์๋ก ํ๋กํผํฐ๋ฅผ ์ ์ํ๋ ๋ฒ๊ฑฐ๋ก์์ ํด๊ฒฐํ ์ ์์ต๋๋ค.
์ ์ ํ๋กํผํฐ/๋ฉ์๋
์ ์ (static) ํ๋กํผํฐ/๋ฉ์๋๋ ์์ฑ์ ํจ์๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์์๋ ์ฐธ์ด/ํธ์ถํ ์ ์๋ ํ๋กํผํฐ/๋ฉ์๋์ ๋๋ค.
// ์์ฑ์ ํจ์
function Person(name){
this.name = name;
}
// ํ๋กํ ํ์
๋ฉ์๋
Person.prototype.sayHello = function () {
console.log(`Hi my name is ${this.name}`);
};
// ์ ์ ํ๋กํผํฐ
Person.staticProp = 'static prop';
// ์ ์ ๋ฉ์๋
Person.staticMethod = function () {
console.log('staticMethod');
};
// ์์ฑ์ ํจ์์ ์ถ๊ฐํ ์ ์ ํ๋กํผํฐ/๋ฉ์๋๋ ์์ฑ์ ํจ์๋ก ์ฐธ์กฐ/ํธ์ถ ๊ฐ๋ฅ
Person.staticMethod(); // staticMethod
const me = new Person('Lee');
// ์ ์ ํ๋กํผํฐ/๋ฉ์๋๋ ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค๋ก ์ฐธ์กฐ/ํธ์ถ์ด ๋ถ๊ฐ๋ฅ
// ์ธ์คํด์ค๋ก ์ฐธ์กฐ/ํธ์ถํ ์ ์๋ ํ๋กํผํฐ/๋ฉ์๋๋ ํ๋กํ ํ์
์ฒด์ธ ์์ ์กด์ฌํด์ผํจ
me.staticMethod(); // TypeError
์ ์์ ๋ฅผ ์ดํด๋ณด๋ฉด Person ์์ฑ์ ํจ์๋ ๊ฐ์ฒด์ด๋ฏ๋ก ์์ ์ ํ๋กํผํฐ/๋ฉ์๋์ธ ์ ์ ํ๋กํผํฐ/๋ฉ์๋๋ฅผ ์์ ํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ ์ ํ๋กํผํฐ/๋ฉ์๋๋ ์ธ์คํด์ค์ ํ๋กํ ํ์ ์ฒด์ธ์ ์ํ ๊ฐ์ฒด์ ํ๋กํผํฐ/๋ฉ์๋๊ฐ ์๋๋ฏ๋ก ์ธ์คํด์ค๋ก๋ ์ ๊ทผํ ์ ์์ต๋๋ค.
ํ๋กํผํฐ ์กด์ฌ ํ์ธ
๊ฐ์ฒด ๋ด์ ํน์ ํ๋กํผํฐ๊ฐ ์กด์ฌํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
in ์ฐ์ฐ์
key in object
- key : ํ๋กํผํฐ ํค๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด
- object : ๊ฐ์ฒด๋ก ํ๊ฐ๋๋ ํํ์
Reflect.has ๋ฉ์๋
ES6์์ ๋์ ๋ ๋ฐฉ๋ฒ์ผ๋ก in ์ฐ์ฐ์์ ๋์ผํ ๊ธฐ๋ฅ์ ํฉ๋๋ค.
Object.prototype.hasOwnProperty ๋ฉ์๋
์ธ์๋ก ์ ๋ฌ๋ฐ์ ํ๋กํผํฐ ํค๊ฐ ๊ฐ์ฒด ๊ณ ์ ์ ํ๋กํผํฐ ํค์ธ ๊ฒฝ์ฐ์๋ง true๋ฅผ ๋ฐํํฉ๋๋ค.
( ์์ ๋ฐ์ ํ๋กํ ํ์ ์ ํ๋กํผํฐ ํค์ธ ๊ฒฝ์ฐ์ false๋ฅผ ๋ฐํ)
const person = {
name: 'Lee',
address: 'Seoul'
};
console.log('name' in person); // true
// ES6์์ ๋์
๋ Refelct.has ๋ฉ์๋์ ๋์ผํจ
console.log(Reflect.has(person, 'name')); // true
console.log(person.hasOwnProperty('name')); // true
ํ๋กํผํฐ ์ด๊ฑฐ
for ... in ๋ฌธ
๊ฐ์ฒด์ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ์ํํ๋ฉฐ ์ด๊ฑฐํ ๋ ์ฌ์ฉํฉ๋๋ค.
const Person = {
name: 'Lee',
address: 'Seoul'
};
for(const key in person) {
console.log(key + ':' + person[key]);
}
// name: Lee
// address: Seoul
// toString์ ์ด๊ฑฐ๋์ง ์์์
console.log('toString' in person); // true
์์ ์ ๊ฐ์ด for .... in๋ฌธ์ ํ๋กํ ํ์ ์ฒด์ธ์์ ์กด์ฌํ๋ ๋ชจ๋ ํ๋กํ ํ์ ์ ํ๋กํผํฐ ์ค์์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ [[Enumerable]]์ ๊ฐ์ด true์ธ ํ๋กํผํฐ๋ฅผ ์ํํ๋ฉฐ ์ด๊ฑฐํ๊ธฐ ๋๋ฌธ์ name๊ณผ address๋ง ์ด๊ฑฐ๋๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
Object.keys/values/entries ๋ฉ์๋
๊ฐ์ ์์ ์ ํ๋กํผํฐ๋ฟ ์๋๋ผ ์์๋ฐ์ ํ๋กํผํฐ๋ ์ด๊ฑฐํ๋ for ... in๋ฌธ๊ณผ ๋ค๋ฅด๊ฒ ๊ฐ์ฒด ์์ ์ ๊ณ ์ ํ๋กํผํฐ๋ง ์ด๊ฑฐํ๊ธฐ ์ํด์๋ Object.keys/values/entries ๋ฉ์๋๊ฐ ๊ถ์ฅ๋ฉ๋๋ค.
- Object.keys : ๊ฐ์ฒด ์์ ์ ์ด๊ฑฐ ๊ฐ๋ฅํํ ํ๋กํผํฐ ํค๋ฅผ ๋ฐฐ์ด๋ก ๋ฐํ
- Object.values : ๊ฐ์ฒด ์์ ์ ์ด๊ฑฐ ๊ฐ๋ฅํ ํ๋กํผํฐ ๊ฐ์ ๋ฐฐ์ด๋ก ๋ฐํ(ES8์์ ๋์ )
- Object.entries : ๊ฐ์ฒด ์์ ์ ์ด๊ฑฐ ๊ฐ๋ฅํ ํ๋กํผํฐ ํค์ ๊ฐ์ ์์ ๋ฐฐ์ด์ ๋ฐฐ์ด์ ๋ด์์ ๋ฐํ(ES8์์ ๋์ )
const person = {
name: 'Lee',
address: 'Seoul',
__proto__: { age: 20 }
};
console.log(Object.keys(person)); // ["name", "address"]
console.log(Object.values(person)); // ["Lee", "Seoul"]
console.log(Object.entries(person)); // [["name", "Lee"], ["address", "Seoul"]]
[์ถ์ฒ] ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive
'JavaScript > ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] ๋นํธ์ธ ๊ฐ์ฒด (0) | 2022.07.25 |
---|---|
[JavaScript] strict mode (0) | 2022.07.24 |
[JavaScript] ํจ์์ ์ผ๊ธ ๊ฐ์ฒด (0) | 2022.07.22 |
[JavaScript] ์์ฑ์ ํจ์์ ์ํ ๊ฐ์ฒด ์์ฑ (0) | 2022.07.22 |
[JavaScript] ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ (0) | 2022.07.21 |
- Total
- Today
- Yesterday
- ํ๋ก๊ทธ๋๋จธ์ค
- Baekjoon
- JavaScript
- ์ด์์ฒด์
- ์ฝ๋ฉํ ์คํธ
- ๋ฐฑ์ค javascript
- git
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
- TDD
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- 2019 ์นด์นด์ค ๊ฐ๋ฐ์ ๊ฒจ์ธ ์ธํด
- ์ ์ญ ๋ณ์
- ๋ ์์ปฌ ํ๊ฒฝ
- http
- ํ๋กํ ์ฝ
- ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ deep dive
- ์นด์นด์ค ์ธํด
- ๋ฐฑ์ค
- ํ๋กํผํฐ
- ์ด๋ถํ์
- ์๋ฐ
- ๋ฐฑ์ค node.js
- fp
- map
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
- ๋์์ธ ํจํด
- ํฌํฌ์ธํฐ
- ์๊ณ ๋ฆฌ์ฆ
- ๋คํธ์ํฌ
- ์๋ฐ์คํฌ๋ฆฝํธ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |