ํ๋กํ ํ์ ๊ฐ์ฒด
ํ๋กํ ํ์ ๊ฐ์ฒด
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ๊ฐ์ฒด๋ ์์ ์ ๋ถ๋ชจ ์ญํ ์ ๋ด๋นํ๋ ๊ฐ์ฒด์ ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๋ง์น ๊ฐ์ฒด ์งํฅ์ ์์ ๊ฐ๋ ๊ณผ ๊ฐ์ด ๋ถ๋ชจ ๊ฐ์ฒด์ ํ๋กํผํฐ ๋๋ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ฌํ ๋ถ๋ชจ ๊ฐ์ฒด๋ฅผ Prototype(ํ๋กํ ํ์ ) ๊ฐ์ฒด ๋๋ ์ค์ฌ์ Prototype(ํ๋กํ ํ์ )์ด๋ผ ํฉ๋๋ค.
Prototype ๊ฐ์ฒด๋ ์์ฑ์ ํจ์์ ์ํด ์์ฑ๋ ๊ฐ๊ฐ์ ๊ฐ์ฒด์ ๊ณต์ ํ๋กํผํฐ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
__proto__ vs prototype ํ๋กํผํฐ
function Person(name) {
this.name = name;
}
var foo = new Person('Lee');
console.dir(Person); // prototype ํ๋กํผํฐ๊ฐ ์๋ค.
console.dir(foo); // prototype ํ๋กํผํฐ๊ฐ ์๋ค.-
prototype
-
ํจ์ ๊ฐ์ฒด๋ง ๊ฐ์ง๊ณ ์๋ ํ๋กํผํฐ์ด๋ค
-
์์ฑ๋ ๊ฐ์ฒด๊ฐ ๋ถ๋ชจ๋ฅผ ๊ฐ๋ฅดํต๋๋ค. ์ฆ, ์์ฑ์ ํจ์(๋๋ ํด๋์ค)๊ฐ ์ ๊ณตํ๋ ๊ณตํต ์ ๋ณด๋ฅผ ๋ด ์ ๊ณตํ๋ ๊ฐ์ฒด๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.
console.log(Person.prototype === foo.__proto__);=> foo๋ผ๋ ์ธ์คํด์ค๋ ๋ถ๋ชจ์ธ Person ๊ฐ์ฒด(์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ฐ์ฒด) ๊ฐ๋ฅดํต๋๋ค.
-
-
__proto__ === [[Prototype]]์ ๋๋ค.
-
ํจ์๋ฅผ ํฌํจํ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์์ต๋๋ค.
-
์์ ์ ๋ถ๋ชจ ์ญํ ์ ํ๋ ํ๋กํ ํ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํต๋๋ค.
console.log(Person.__proto__ === Function.prototype);=> Function.prototype์ Person ์์ฑ์ ํจ์์๊ฒ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ฐ์ฒด๋ก์ ๋ถ๋ชจ ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ต๋๋ค.
-
constructor
constructor: prototype(๊ณต์ ์ ๋ณด ์ ๊ณต ๊ฐ์ฒด)์ ์์ฑํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํต๋๋ค.
function Person(name) {
this.name = name;
}
var foo = new Person('Lee');
// Person.prototype ๊ฐ์ฒด๋ฅผ ์์ฑํ ๊ฐ์ฒด๋ Person() ์์ฑ์ ํจ์์
๋๋ค.
console.log(Person.prototype.constructor === Person);
// foo ๊ฐ์ฒด๋ฅผ ์์ฑํ ๊ฐ์ฒด๋ Person() ์์ฑ์ ํจ์์
๋๋ค.
console.log(foo.constructor === Person);
// Person() ์์ฑ์ ํจ์๋ฅผ ์์ฑํ ๊ฐ์ฒด๋ Function() ์์ฑ์ ํจ์์ด๋ค.
console.log(Person.constructor === Function);ํ๋กํ ํ์ ์ฒด์ธ
์๋ฐ์คํฌ๋ฆฝํธ๋ ํน์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ๋ฉ์๋์ ์ ๊ทผํ๋ ค๊ณ ํ ๋ ํด๋น ๊ฐ์ฒด์ ์ ๊ทผํ๋ ค๋ ํ๋กํผํฐ ๋๋ ๋ฉ์๋๊ฐ ์๋ค๋ฉด __proto__ ๊ฐ๋ฆฌํค๋ ๋งํฌ๋ฅผ ๋ฐ๋ผ ์์ ์ ๋ถ๋ชจ ์ญํ ์ ํ๋ ํ๋กํ ํ์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ์ฐจ๋ก๋๋ก ๊ฒ์ํ๋ค. ์ด๊ฒ์ ํ๋กํ ํ์ ์ฒด์ธ์ด๋ผ ํ๋ค.
์์ฑ์ ํจ์๋ก ์์ฑ๋ ๊ฐ์ฒด์ ํ๋กํ ํ์ ์ฒด์ธ
var person = {
name: 'Lee',
gender: 'male',
sayHello: function () {
console.log('Hi! my name is ' + this.name);
},
};
console.log(person.__proto__ === Object.prototype); // โ true
console.log(Object.prototype.constructor === Object); // โก true
console.log(Object.__proto__ === Function.prototype); // โข true
console.log(Function.prototype.__proto__ === Object.prototype); // โฃ true
- Person ๊ฐ์ฒด์ Object.prototype์ ๊ด๊ณ
- person ์ธ์คํด์ค๋ ๊ฐ์ฒด๋ฆฌํฐ๋ด๋ก ์์ฑ์ด ๋์๊ณ ๊ณต์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ฐ์ฒด๋ Object.prototype ๊ฐ์ฒด์ ๋๋ค.
- Object.prototype์ Object ๊ด๊ณ
- Object ์์ฑ์ ํจ์์ ์ํด Object.prototype(๊ณต์ ์ ๋ณด ๊ฐ์ฒด)์ ์์ฑํ์ต๋๋ค.
- Object์ Function.prototype์ ๊ด๊ณ
- Object๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ ์์ฑ์ ํจ์์ ๋๋ค. Object ์์ฒด๋ ํจ์์ด๊ธฐ ๋๋ฌธ์, Function.prototype์ ์์๋ฐ์ต๋๋ค. ์ฆ, Object.__proto__ === Function.prototype์ด ์ฑ๋ฆฝํฉ๋๋ค
- Function.prototype๊ณผ Object.prototype์ ๊ด๊ณ
-
Function.prototype์ ์ผ๋ฐ ๊ฐ์ฒด์ ๋๋ค. ๊ทธ๋์ Object.prototype์์ ์์๋ฐ์ต๋๋ค.