220823(ํ)
๐ชด ์ฑ์ฅ์ผ์ง
์ฑ
ํ๋ณตํ ์ด๊ธฐ์ฃผ์์(์จ์ธ ๋ค์ด์ด)
์ ๋ด์ฉ์ ์๊ทน๋ฐ์ ์์ํ๋ ์๋ฐํ ์ฑ์ฅ๊ธฐ๋ก
์ด์์๋ ๊ฝ๊ณผ ์ฃฝ์ ๊ฝ์ ์ด๋ป๊ฒ ๊ตฌ๋ณํ๋๊ฐ?
์ฑ์ฅํ๊ณ ์๋ ๊ฒ์ด ์ด์ ์๋ ๊ฒ์ด๋ค.
์๋ช ์ ์ ์ผํ ์ฆ๊ฑฐ๋ ์ฑ์ฅ์ด๋ค!
๐ณ ํค์๋ ์ต๋ํ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌ, ์ถํ์ ๋ณด๋ฉด์ ์ค์ค๋ก ์ค๋ช
JavaScript
ํ๋กํ ํ์
(remind)
์๋ฐ์คํฌ๋ฆฝํธ์ ๊ธฐ๋ฐ์ด ๋๋ ๊ฐ๋
์ผ๋ก ์ด๋ค ์์ฑ์ ํจ์์ ๋ฉ์๋๋ฅผ ๋ด๊ณ ์๋ ํน๋ณํ ๊ฐ์ฒด
์ด ์์ฑ์ ํจ์๋ฅผ ํตํด instance๋ฅผ ๋ง๋ค๊ฒ ๋๋ฉด instance๋ __proto__
๋ผ๋ ๊ฐ์ฒด๋ฅผ ํตํด ์์ฑ์์ prototype ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ๊ทธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์
์ฌ์ค
instance.__proto__
๋ณด๋คObject.getPrototypeOf(instance)
๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅ
__proto__
๋ ์๋ต ๊ฐ๋ฅํ ํ๋กํผํฐ -> ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด๋ฅผ ์ฐฝ์ํ ๋ธ๋๋ ์์ดํฌ๊ฐ ์ ํ ๊ฒ์ผ๋ก ์ดํด์ ์์ญ์ด ์๋! ๊ทธ๋ฅ ๊ทธ๋ ๊ตฌ๋ ํ๋ฉด ๋จ
var instance = new Constructor();
// ์๋ 5๊ฐ์ง ๋ชจ๋ ๊ฐ์ Constructor๋ฅผ ๊ฐ๋ฆฌํค๋ ํํ
Constructor;
instance.__proto__.constructor;
instance.constructor; // __proto__ ์๋ต ๊ฐ๋ฅ
Object.getPrototype(instance).comstructor;
Constructor.prototype.constructor;
๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋
- ์ค์ฝํ ์ฒด์ด๋๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋๊ฐ ์ฌ๋ฌ ๊ณณ์ ์์ ๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณณ์์ ๊ทธ ๋ฉ์๋์ ์ ๊ทผ
var Dog = function (name) {
this.name = name;
};
Dog.prototype.bark = function () {
return this.name + ' ์์~!';
};
var hodu = new Dog('hodu');
hodu.bark = function () {
return this.name + ' ๋ฐ์ฐ๋ฐ์ฐ~!';
};
console.log(hodu.bark()); // hodu ๋ฐ์ฐ๋ฐ์ฐ~! -> ์ฆ, protorype์ ๋ฉ์๋๋ณด๋ค instance์ ์์ฒด ๋ฉ์๋๊ฐ ๋ ์ฐ์
console.log(hodu.__proto__.bark()); // undefined -> this๊ฐ hodu๊ฐ ์๋ hodu__proto__๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋จ
console.log(hodu.__proto__.bark.call(hodu)); // hodu ์์~! -> call์ ํตํด this๋ฅผ hodu๋ก ๋ฐ์ธ๋ฉํด์ฃผ๋ฉด ํด๊ฒฐ
Object
- ๋ชจ๋ ์์ฑ์ ํจ์์ ์ํด ์์ฑ๋ ๊ฐ์ฒด๋ค์ prototype์ด๋ผ๋ ํ๋กํผํฐ ์์ฒด๊ฐ โObjectโ์ด๋ฏ๋ก Object์ prototype์ ์๋ ๋ชจ๋ ๋ฉ์๋์ ์ ๊ทผ ๊ฐ๋ฅ
- ๋จ, ์ ๋ง ๊ฐ์ฒด({})๋ง์ด ๊ฐ์ง ํจ์๋ ํ์ํ๋ฏ๋ก ๊ทธ ๋ถ๋ถ์ static method๋ก Object.freeze์ ๊ฐ์ ํ์์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
๋ค์ค ํ๋กํ ํ์ ์ฒด์ธ
์์ฑ์์ prototype์ ๋๋ค๋ฅธ ์์ฑ์์ ์ธ์คํด์ค๋ฅผ ํ ๋นํจ์ผ๋ก์จ ๊ทธ ์์ฑ์์ ๋ฉ์๋๋ ์ฌ์ฉํ ์ ์๊ฒ ๊ณ์ ์ฒด์ธํ๋ ๋ฐฉ๋ฒ
- ์ด ๊ฐ๋ ์์ฒด๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ์์ ํด๋์ค๋ฅผ ๊ตฌํ ์ ์ฌ์ฉ๋จ
JavaScript
ํด๋์ค(remind)
์๋ฐ์คํฌ๋ฆฝํธ๋ ํ๋กํ ํ์
๊ธฐ๋ฐ์ด๊ธฐ์ ์์
์ด๋ผ๋ ๊ฐ๋
์ด ์กด์ฌํ์ง ์์
์ด๋ ๋ฏ ์์์ ๊ฐ๋
์ด ์กด์ฌํ๋ ํด๋์ค๋ฅผ ๋ฐ๋ผํ๊ธฐ ์ํ ๋ค์ํ ๊ธฐ๋ฒ๋ค์ด ์๊ฒผ์
์ถํ ES6์์๋ ํด๋์ค ๋ฌธ๋ฒ์ด ๊ตฌํ๋์์(์ด๋ง์ ๋ ํ๋กํ ํ์
์ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ฒ)
- superclass: ์์ ํด๋์ค; super
- subclass: ํ์ ํด๋์ค; sub
ํ์ค ์ธ๊ณ๋ ์ด๋ฏธ ์กด์ฌํ๋ ์๋ง์ ๊ฐ์ฒด๋ค์ ๊ณตํต์ , ์ฐจ์ด์ ์ ๋ถ์ํ์ฌ ํด๋์ค๋ฅผ ํ๋ํ๋ ์ ์ํ๋ ์
ํ๋ก๊ทธ๋๋ฐ์์ ํน์ ํด๋์ค๋ฅผ ๋จผ์ ๋ง๋ ํ, ๊ทธ ํด๋์ค์ ์ฑ์ง๊ณผ ๊ฐ๊ฐ์ด ๊ฐ๋ ๊ฐ๋ณ ์ฑ์ง์ ๊ฐ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ด๊ฒ ๋จ
- static method: ์์ฑ์ ์์ฒด๊ฐ ๊ฐ๋ ๋ฉ์๋(ํจ์) ex) Array.from() -> instance๊ฐ ํ์ฉ ๋ถ๊ฐ๋ฅ
- prototype method: ์์ฑ์์ prototype์ด ๊ฐ๋ ๋ฉ์๋(ํจ์) ex) Array.prototype.push() -> instance๊ฐ ํ์ฉ ๊ฐ๋ฅ
- instance method: instance๊ฐ ๊ฐ๋ ๋ฉ์๋(ํจ์)๋ก instance๋ง๋ค ์ง์ ๋ถ์ฌํ๋ ๋ฉ์๋ ํจ์
ํด๋์ค ์์: ์๋ฐ์คํฌ๋ฆฝํธ์์ ํด๋์ค ์์์ ๊ตฌํ -> ํ๋กํ ํ์ ์ฒด์ด๋์ ์ ์ฐ๊ฒฐํ๋ค๋ ์๋ฏธ
var First = function (name) {
this.name = name;
};
First.prototype = []; // ํ๋กํ ํ์
์ Array์ instance(๋ฐฐ์ด ๋ฆฌํฐ๋ด ํํ)์ ํ ๋น
var jayden = new First('jayden');
jayden.push(); // ํ๋กํ ํ์
์ฒด์ด๋์ ์ํด Array์ prototype method๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅํด์ง
์์ ๊ฒฝ์ฐ 2๊ฐ์ง์ ๋ฌธ์ ๊ฐ ์กด์ฌ
- First.prototype์ []๋ฅผ ํ ๋นํจ์ผ๋ก์จ [] ์์ฒด๊ฐ ๊ฐ๋ ํ๋กํผํฐ๊ฐ ์ค๋ฅ๋ฅผ ์ผ์ผํฌ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌ
- jayden์ ์์ฑ์์ธ First์ ๋ค์ ์ ๊ทผํ ๋ฐฉ๋ฒ์ด ์์(First.prototype = []์ผ๋ก ํ๊ธฐ ๋๋ฌธ)
1๋ฒ ๋ฌธ์ ํด๊ฒฐ๋ฒ
- delete First.prototype.method ์์ผ๋ก ํ๋ํ๋ ์ง์์ฃผ๊ธฐ
- ๋น์ด์๋ ์์ฑ์ ํจ์ Bridge๋ฅผ ํตํด ์ฐ๊ฒฐ
- Object.create(์์ฑ์.prototype)์ ์ฌ์ฉํด์ ์ฐ๊ฒฐ
2๋ฒ ๋ฌธ์ ํด๊ฒฐ๋ฒ
Subclass.prototype.constructor = Subclass ๋ก ๋ค์ constructor๋ผ๋ ํ๋กํผํฐ๋ฅผ ์ฌํ ๋น
ES6์ ์ถ๊ฐ๋ ํด๋์ค ๋ฌธ๋ฒ ์์
var ES6 = class {
constructor(name) {
this.name = name;
}
static staticMethod() {
return this.name + ' staticMethod';
}
method() {
return this.name + ' method';
}
};
var es6Instance = new ES6('es6');