ํด๋น ํฌ์คํธ๋ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive 19์ฅ์ ์ฝ๊ณ ์ ๋ฆฌํ๋ ํฌ์คํธ์ ๋๋ค.
์ ๊ฐ ์ดํดํ ํ๋กํ ํ์ ์ด๋ ์์ฑ์ ํจ์์ ์ฐธ์กฐ์ ์์ ํ๋กํ ํ์ ์ ์ฐธ์กฐ์ ๊ณต์ ํ ํ๋กํผํฐ/๋ฉ์๋๋ค์ ๊ฐ์ง๋ ๊ฐ์ฒด์ ๋๋ค.
// ์์ฑ์ ํจ์ ( ๊ฒ์ผ๋ก๋ ์ผ๋ฐ ํจ์์ ๋ค๋ฅผ๊ฑฐ ์์ )
// ๊ด์ต์ ์ผ๋ก ์นด๋ฉ์ผ์ด์ค๋ฅผ ์ฌ์ฉํ๊ณ , ํธ์ถํ ๋ ๋ฐ๋์ new๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ธํ๋ฉด ์ผ๋ฐ ํจ์์ ๋์ผํจ
function Animal(cry) {
this.cry = cry;
// ๋นํจ์จ์ ์ธ ๋ฐฉ๋ฒ ( ์์ฑํ๋ ๊ฐ์ฒด๋ค ๊ฐ๊ฐ์ด "say()"๋ผ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง )
// this.say = () => console.log("๋์ถฉ ๋๋ฌผ ์๋ฆฌ >> ", this.cry);
}
// ์์ฑํ๋ ๊ฐ์ฒด๋ค์ด "say()"๋ผ๋ ๋ฉ์๋๋ฅผ ๊ณต์ ํจ ( * ํ์ดํ ํจ์ ์ฌ์ฉํ๋ฉด this๊ฐ ์๋ชป๋ ๊ฐ์ ๊ฐ๋ฆฌํด * )
Animal.prototype.say = function () {
console.log("๋์ถฉ ๋๋ฌผ ์๋ฆฌ >> ", this.cry);
};
// ์ ์ (static) ๋ฉ์๋ ์ ์ ( ๊ฐ์ฒด๊ฐ ๊ฐ์ง๋ ๊ฐ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ ex) this.cry )
Animal.sleep = () => console.log("์๋ค");
// ๊ฐ์ฒด ์์ฑ
const dog = new Animal("๋ฉ๋ฉ");
// ํ๋กํ ํ์
์ฒด์ธ์ ์ด์ฉํด์ ์ฐพ์ ๋ฉ์๋ ์ฌ์ฉ ( dog --- [[Prototype]] ---> Animal.prototype )
dog.say();
// ์ ์ ๋ฉ์๋ ์ฌ์ฉ ( ๊ฐ์ฒด์์ ํธ์ถ ๋ถ๊ฐ๋ฅ )
Animal.sleep();
// dog.__proto__ === Animal.prototype
console.log(Object.getPrototypeOf(dog) === Animal.prototype); // true
// dog.__proto__.__proto__ === Object.prototype
console.log(Object.getPrototypeOf(Object.getPrototypeOf(dog)) === Object.prototype); // true
// dog.__proto__.__proto__.__proto__ === null ... ํ๋กํ ํ์
์ฒด์ธ์ ์ข
์
non-constructor
ํจ์๋ ํ์ดํ ํจ์, es6 ๋ฌธ๋ฒ์ ์ฌ์ฉํ ๋ฉ์๋, ํ๋กํ ํ์
์ ๋ฉ์๋(์ ์์์์๋ say()
) ๋ค์ ๋งํ๋ค.non-constructor
ํจ์๋ prototype
์์ฒด๋ฅผ ์์ฑํ์ง ์์ผ๋ฉฐ, new ์ฐ์ฐ์ ์์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.__proto__
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋จ Object.getPrototypeOf()
์ Object.setPrototypeOf()
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.undefined
๋ฅผ ๋ฐํํ๋ค.getter
๊ฐ๋ฅ, setter
๋ถ๊ฐ๋ฅ )prototype
์ ์์๋ก ๊ต์ฒดํ ์ ์๋ค. ( dog.__proto__ = {}
์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅ )instanceOf
๋ ์ด๋ค ์์ฑ์ ํจ์๋ก ์ธํด์ ์์ฑ๋ ๊ฐ์ฒด์ธ์ง์ ์ํด์ ํ๋จ๋๋ ๊ฒ์ด ์๋๋ผ ํ๋กํ ํ์
์ฒด์ธ์ ์กด์ฌํ๋์ง ์ ๋ฌด๋ก ํ๋จํ๋ค.