Prototypes in Javascript
์๋ฐ์คํฌ๋ฆฝํธ ์ธ๊ณ์ ๊ฐ์กฑ ๊ด๊ณ๋๋ฅผ ์์๋ณด๊ฒ ๋ค. ๐จโ๐ฉโ๐งโ๐ฆ (์ค์?)
ํค์๋๋
prototype (์๋น )
constructor (์๋ง)
instance (์์)
์ด ๋ ๊ฒ์ด๋ค.
Prototype
์ด๋ผ๋ ๋จ์ด๊ฐ ๋ปํ๋ ์๋ฏธ๋ ์์ด์ ์ธ ํํ , ์๋์ํํ๋ฅผ ๋งํ๋ค.
Constructor
์์ฑ์ํจ์ new ํค์๋์ ํจ๊ป ์ฐ์ด๋ ํจ์๋ฅผ ๋งํ๋ค.
you don't konw js ์ฑ ์์์ ์ ์๋ ์ฐพ์๋ณด์
์๋ฐ์คํฌ๋ฆฝํธ์ ์์ฑ์๋ ์์ new ์ฐ์ฐ์๊ฐ ์์ ๋ ํธ์ถ๋๋ ์ผ๋ฐ ํจ์์ ๋ถ๊ณผํ๋ค. ํด๋์ค์ ๋ถ์ ๊ฒ๋ ์๋๊ณ ํด๋์ค ์ธ์คํด์คํ ๊ธฐ๋ฅ๋ ์๋ค. ์ฌ์ง์ด ํน๋ณํ ํํ์ ํจ์๋ ์๋๋ค. ๋จ์ง new๋ฅผ ์ฌ์ฉํ์ฌ ํธ์ถํ ๋ ์๋์ผ๋ก ๋ถ๋ค๋ ค ์คํ๋๋ ๊ทธ์ ํ๋ฒํ ํจ์๋ค.
15.7.2 Number ์์ฑ์(ES5.1๋ช ์ธ) new ํํ์์ ์ผ๋ถ๋ก ํธ์ถ ์ Number๋ ์์ฑ์์ด๋ฉฐ ์๋ก ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๋ค.
new๋ฅผ ๋ถ์ฌ์ ํธ์ถ ํ ์ ์๊ณ ์ด๋ ๊ฒฐ๊ตญ
์์ฑ์ ํธ์ถ์ด๋ ๋ค๋ฆ์๋ค. ์์ฑ์ ํจ์๊ฐ ์๋๋ผํจ์๋ฅผ ์์ฑํ๋ ํธ์ถ์ด๋ผ๊ณ ํด์ผ ์ณ๋ค.
์ฌ๊ธฐ์ ์ฃผ๋ชฉํ๊ฒ ๋๋ ํค์๋๋ค์ด ์๋ค. ์๋ก ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๋ค์ ํจ์๋ฅผ ์์ฑํ๋ ํธ์ถ ์ดํด๊ฐ ์ ๋๋ ํค์๋๋ค!
๋ํ ์ถ๊ฐ๋ก new๋ฅผ ๋ถ์ฌ ์์ฑ์ ํธ์ถ์ ํ๋ฉด ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ๊ฐ๋ตํ๊ฒ ์์๋ณด์.
์ ๊ฐ์ฒด๊ฐ ํญ ๋ง๋ค์ด์ง๋ค.
์๋ก ์์ฑ๋ ๊ฐ์ฒด์ [[Prototype]]์ด ์ฐ๊ฒฐ๋๋ค.
์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ ํด๋น ํจ์ ํธ์ถ์ this๋ก ๋ฐ์ธ๋ฉ ๋๋ค.
์ด ํจ์๊ฐ ์์ ์ ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ์ง ์๋ ํ new์ ํจ๊ป ํธ์ถ๋ ํจ์๋ ์๋์ผ๋ก ์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
new ํค์๋์ ํจ๊ป ์ฐ์ด๋ ํจ์
new Array(); - ์ฌ๊ธฐ์ ์์ฑ์ ํจ์๋ Array(); ์ด๋ค.
new Object();
new Function();
ํน์ง์ด ์๋๋ฐ ํจ์๋ช ์ ์ฒซ๊ธ์๋ ๋๋ฌธ์๋ฅผ ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ์ง๊ธ ๊น์ง ์ด๋ ๊ฒ ์ง์ ์ ์ผ๋ก ์ฐ์ง ์์์ด๋ ์ฐํํด์ ์ฌ์ฉํ์ ๊ฒ์ด๋ค.
๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ ์์ฑ์ ํจ์๋ฅผ ํตํด์ ๋ง๋ค์ด ์ง๊ฒ์ด๋ค!
var arr = [];
varr arr = new Array(); // ์ฌ์ค์ ๋๊ฐ์ ๊ฒ์ด๋ค.๋ํ ์์ฑ์ ํจ์๋ ํจ์์ด๊ณ -> ํจ์๋ ๊ฐ์ฒด์ด๋ค. ๊ทธ๋์ ์์ฑ์ํจ์๋ -> ๊ฐ์ฒด์ด๋ค. ํจ์์ธ๋ฐ ๊ฐ์ฒด์ด๋ค? ์ด๊ฒ์ด ๋ฌด์จ๋ป์ด๋ํ๋ฉด ์์ฑ์ ํจ์๊ฐ ๊ฐ์ฒด์ ํน์ง์ ๊ฐ์ง ์ ์๋ค๋ ๊ฒ์ด๋ค. ๊ทธ ํน์ง์ด ๋ฌด์์ธ์ง ์์๋ณด์.
๊ฐ์ฒด์ ํน์ง key์ value๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์์ฑ์ ํจ์๋ Key์ value๋ฅผ ๊ฐ์ง ์ ์๋ค. ์์ฑ์ ํจ์์ธ Array() , Object(), Function()๋ key์ value๋ฅผ ๊ฐ์ง ์ ์๋ค.
ํ์ง๋ง ์ด๋ฌํ Array(), Object(), Function()์ ๊ณตํต์ ์ผ๋ก ์ฐ์ด๋๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก key์ value๋ ๋ง๋ค์ง ์๋๊ฒ ์ข๋ค.
๋ํ ์์ฑ์ ํจ์๋ ์ํ๋ฉด ์ฐ๋ฆฌ๊ฐ ๋ง๋ค ์ ์๋ค. ์์ฑ์ ํจ์์ธ์ง์ ๋ํ ์ ํํ ํ๋จ์ ์ฐ์์ ๋ฐ๋ผ ๋ง๋ ์๋๋๋ก ๋๋ ์ ์๋ค.
์ด์ ํจ์์ prototype์ ๊ด๊ณ๋ฅผ ์์๋ณด์.
ํจ์์ prototype์ ๊ด๊ณ - ๋ชจ๋ ํจ์๋ prototype ์์ฑ์ด ์๋ค!
ํจ์๋ฅผ ๋ง๋ค๋ฉด ๋ฌด์กฐ๊ฑด prototype์ด๋ผ๋ ์์ฑ์ด ๊ปด์๋ค.
function foo () {
return 3;
}
//๋ชจ๋ ํจ์์๋ prototype์ด๋ผ๋ ์์ฑ์ ๊ฐ์ง๊ณ ์๋ค!
console.log(foo.prototype); // {constructor: ฦ}
function Foo () {
return 3;
}
//๋ชจ๋ ํจ์์๋ prototype์ด๋ผ๋ ์์ฑ์ ๊ฐ์ง๊ณ ์๋ค!
console.log(Foo.prototype); // {constructor: ฦ}์ฝ์์ ์ง์ ์ฐ์ด๋ณธ๋ค๋ฉด ์์ฑ์ ํจ์๊ฐ ๋ง๋ ์๋๋ ํจ์๋ช
.prototype์ผ๋ก ์ฐ์ด๋ณด๋ฉด ํจ์๋ prototype์ด๋ผ๋ ์์ฑ์ ๊ฐ์ง๊ณ ์๊ณ ๊ฐ์ผ๋ก๋ {constructor: ฦ}๋ฅผ ํ์ธ ํ ์ ์๋ค.
prototype์ ํด๋น๋๋ value๋ ๊ฐ์ฒด์์ ํ์ธ ํ ์ ์๋ค.
์์ฌ ์ฝ๋๋ก ์ค๋ช
ํ๋ค๋ฉด Foo = { prototype: {} }๋ก ์๊ฐํ ์ ์๋ค.

prototype์ value๋ก {}๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๊ทธ ๊ฐ์ฒด๋ค์ ์๋์ ์ผ๋ก key์ value๊ฐ ์ค์ ๋์ด์ ธ ์๋ค. ๋ํ constructor์ value๋ ์๊ธฐ์์ Foo()๋ก ์ค์ ๋์ด ์๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
Construct๋ .prototype ์์ฑ์ ๊ฐ์ง๊ณ .prototype์ Prototype์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.

์์ฑ์ ํจ์๋ฅผ ๋ง๋ค์๋ค!(๋ชจ๋ ํจ์ ๋ค ํฌํจ์ด ๊ฐ๋ฅํ๋ค)
์์ฑ์ ํจ์๋ ์๋์ผ๋ก
prototype์ด๋ผ๋ ์์ฑ์ ๊ฐ์ง๊ฒ ๋๋ค.์ด
prototype ์์ฑ์ด ๊ฐ๊ณ ์๋ value๋ ์ด๋ค ํ๋์prototype์ด๋ผ๋ ๋ถ๋ฅด๋ ๊ฐ์ฒด์ด๋ค.
Prototype์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ฐ์ฒด์๋ ํญ์ ๋ฐ๋์ .construct๋ผ๋ ์์ฑ์ ๊ฐ์ง๋ค.

console๋ก ํ์ธํด๋ณด์

Object๋ผ๋ ์์ฑ์ ํจ์๊ฐ ์๋ค.

์ด Object๋ผ๋ ์์ฑ์ ํจ์์๋ .prototype์ด๋ผ๋ ์์ฑ์ ๊ฐ์ง๊ณ ์๊ณ ์ด .prototype์ Prototype์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.

prototype์ด๋ผ๋ ๊ฐ์ฒด์๋ constructor๋ผ๋ ์์ฑ์ด ์๋๋ฐ ๊ทธ ์์ฑ์ ์์ฑ์ํจ์๋ฅผ ๊ฐ๋ฆฌํจ๋ค.

constuctor์์ฑ์ constructor๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
construct๋ ๋ prototype์ด๋ผ๋ ์์ฑ์ ๊ฐ์ง๋ค.
์ ๋ฆฌํ์๋ฉด

Constructor๋ .prototye์ด๋ผ๋ ์์ฑ์ ๊ฐ์ง๋ค.
.prototype์์ฑ์ Prototype์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๋ค.
Prototype๊ฐ์ฒด๋ .constructor๋ผ๋ ์์ฑ์ ๊ฐ์ง๊ฒ ๋๋ค.
.constructor๋ผ๋ ์์ฑ์ Constructor๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.
Constructor๋ ๋ค์ .prototype์ด๋ผ๋ ์์ฑ์ ๊ฐ์ง๊ฒ ๋๋ค.
์ด๋ก์จ Constroctor์ Prototype์ .prototype๊ณผ .constructor ์์ฑ์ ๊ฐ์ง๊ณ ๊ทธ ์์ฑ์ prototype์ด๋ผ๋ ๊ฐ์ฒด์ Constructor๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์ ์๋ก๊ฐ ์๋ก๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.
๋จํธ๊ณผ ์๋ด๋ก ๋น์ ํด ๋ณด์ ๐

constructor๊ฐ ๋จํธ์ด ๋๊ณ prototype์ ์๋ด๊ฐ ๋๋ค. ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋จํธ๊ณผ ์๋ด๋ฅผ ๋ถ๋ฅด๋ ๋ฐฉ๋ฒ์ ๋นจ๊ฐ ํ์ดํ๋๋ก ๋ถ๋ฅผ ์ ์๋ค๊ณ ์๊ฐํ๋ฉด ์ข๋ ์ฝ๋ค!
๐์ค์ ๋ก ์์ ์ ํ ๋์ ์ฐ์ง ์๋๋ค.
Instance ๐จโ๐ฉโ๐งโ๐ฆ
(ํ๊ฐ์ง์) ๊ฒฝ์ฐ
var obj = new Object();new๋ฅผ ํตํด ์์ฑ์ํจ์๋ฅผ ํธ์ถ ํ๋ฉด ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํด์ค๋ค. ์์ฑ์ํจ์๋ ๋ฌด์กฐ๊ฑด this๋ฅผ returnํด์ฃผ๊ณ this๋ ๊ฐ์ฒด์ด๋ค.
new Object()๋ฅผ ํ ๊ฒฐ๊ณผ๋ฌผ์ ์ธ์คํด์ค๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๋๋ฅ
function Foo() {}
var k = new Foo();new Foo();๋ผ๋ ๊ฒ์ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๊ฒ์ธ๋ฐ ์ด๊ฒ์ Foo์ ์ธ์คํด์ค๋ผ๊ณ ๋งํ๋ค.
var a = new Array();
var b = new Array();
var a = [];
var b = [];
console.log(a === b) // false์์ ๋์ค์ด ๋๊ฐ๋ค๊ณ ๋ง ํ ์์๋ค. ํ์ง๋ง a์ b๋ ๊ฐ๋ค๊ณ ํ ์ ์๋ค.
๋ฐฉ๊ธ์ ๋จํธ๊ณผ ์๋ด์ ๋น์ ๋ฅผ ํ์๋๋ฐ instance๋ ๋จํธ๊ณผ ์๋ด์ ๊ฒฐ๊ณผ๋ฌผ์ด๋ผ๊ณ ์๊ฐํด๋ณด์.
var obj = new Object();์ฌ๊ธฐ์ ๋จํธ์? Object๊ฐ ๋๋ค.
์ฌ๊ธฐ์ ์๋ด๋? Object.prtotype์ด ๋๋ค.
function Foo() {}
var f = new Foo();f๋ ์ ๊ธฐ๋ค.
Foo๊ฐ ์๋น ๊ฐ ๋๋ค.
Foo.prtotype์ด ์๋ง๊ฐ ๋๋ค.
Prototype chain! ๐ฉโ๐ง
var obj = {};๋จํธ
๋จํธ์ ์๋ด
๊ทผ๋ฐ ์์์ด? constructor๋ฅผ ์ฌ์ฉ ํ ์ ์๋ค?
.constructor๋ ์๋ง ์ฆ Prototype์ด ๊ฐ์ง๋ ์์ฑ์ด ์๋ค.
obj์๊ฒ ์๋ฌด๊ฒ๋ ํ ๋นํ์ง ์์๋๋ฐ constructor๋ฅผ ๊ฐ์ง ์ ์๋ ์ํฉ์ด๋ค.
์ด๊ฒ ๋ฌด์จ์ผ์ด๋???! ์์์ด ์๋ง์ ๋ฌผ๊ฑด์ ์ฌ์ฉํ ์ํฉ์ด๋ค.
์์์ ์ผ๋จ ์์ ์ด ๊ฐ์ง๊ณ ์๋์ง ํ์ธํ ํ! ์ฒดํฌ์ฒดํฌ -> ์๋ค๋ฉด ์๋ง๊ป ์ฌ์ฉ ํ๋ค.
var obj = {};
Object.prototype.haha = 123; // ์๋ง์๊ฒ haha๋ผ๋ ์์ฑ์ ์ค์ ํด์คฌ๋ค.
console.log(obj.haha) // 123obj์๊ฒ haha๋ฅผ ๋ง๋ค์ด ์ฃผ์ง ์์๋๋ฐ! haha๋ฅผ ๊ฐ์ง! ๐ฉโ๐ง
์ธ์คํด์ค(์์)๋ ์์ ์ด ๋ญ๊ฐ๋ฅผ ํ์๋ก ํ ๋ ๋จผ์ ์์ฌ๊ป ์์ ์ด ๊ฐ์ง๊ณ ์๋์ง ํ์ธ ํ ํ ์๋ค๋ฉด prototype(์๋ง)์์ ์ฐพ๋๋ค.
๊ทธ๋ฆผ์ผ๋ก ํ์ธํ๋ค๋ฉด

Dunder Proto
proto ์ด๋ ๊ฒ ์๊ธด๊ฑธ Dunder Proto๋ผ๊ณ ํ๋ค.
a ๋ผ๋ instance๋ฅผ ์์ฑํ a๋ฅผ console์ ์ฐ์ด๋ณด๋ฉด {} ๋น๊ฐ์ฒด๊ฐ ๋ณด์ธ๋ค. ๊ทธ ์์ ์ด์ด๋ณด๋ฉด Prototype(์๋ง)๊ฐ ๊ฐ์ง๋ ์์ฑ๊ณผ ๊ฐ์ด ์๋ค! {constructior: Object} ์๋ง์ ์ ๋ณด๋ฅผ ์ ์ฅํด ๋์ ๊ฒ์ด๋ค.
function Person (name) {
this.name = name;
}
// Person === ๋จํธ
// Person.prototype === ๋จํธ์ ์๋ด
// ์์ด ์์ฑ
var kennim = new Person('ken ken');
kennim.constructor === Person;
kennim.__proto__ === Person.prototype;๋ง์ง๋ง 2์ค์ ์์ธํ ์ดํด๋ณด์.
kennim.constructor === Person;kennim์๋ constructor๋ผ๋ ์์ฑ์ด ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋ง์ธ prototype์์ ์ดํด๋ณผ ๊ฒ์ด๊ณ , prototype์ .constructor๋ผ๋๊ฑธ ๊ฐ์ง๊ณ ์๋ค. ์ด .construct๋ ์๋น ๋ฅผ ๋ฐ๋ผ๋ณธ๋ค. ์๋น ๋ Constructor๊ณ ๊ทธ๊ฒ์ Person์ด๊ธฐ ๋๋ฌธ์ true๋ค!
kennim.__proto__ === Person.prototype;์๊น ์์์ ๋ดค๋ฏ์ด Dunder proto๋ Prototype์ด ๊ฐ์ง ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ true
var o = new Object();
o.costructor === Object();
o.constructor = function bar () {}
console.log(o.constructor === Object); // false;o ์ธ์คํด์ค ์์์ด ๊ฐ์ง constructor๋ฅผ ๊ฐ์ฅ ๋จผ์ ์ฐพ๋๋ฐ ๊ทธ๊ฒ์ bar function ์ด๊ธฐ ๋๋ฌธ์ false๊ฐ ๋๋ค.

์์์ด ์๋ง์๊ฒ ์ ๊ทผํ๊ณ ์ ํ ๋ Dunder proto๋ก ํ ์ ์๊ธด ํ๋ค. ํ์ง๋ง ํ๋ฉด ์๋๋ค.
์ ๊ฑธ ์ฐ์ฌ์ผ ํ๋ ์ํฉ์ ์ฝ๋๊ฐ ์ ๋๋ก ์ง์ฌ์์ง ์๋ค๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ ์ค๋ฅ๋ฅผ ํด๊ฒฐํด์ผ์ง ์ ๊ทผํ๋ฉด ์๋๋ค.
์๋ง์๋น ๋ ์๋ง์๋น ๊ฐ ์๋ค.
function Foo () {} // ์์ฑ์ํจ์ - ์๋น
console.log(Foo.prototype); // ์์ฑ์ํจ์.prototype - ์๋ง
console.log(typeof Foo.prototype) // ๊ฐ์ฒด๋ค. ๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ ๋ง๋ค์ด ์ง๋๊ฐ? new Object() ์ด๋ ๊ฒ๋ค.
// Foo.prototype ์ ๋ํ ๋๊ตฐ๊ฐ์ ์์์ด๋ ๋ง์ด๋ค.Foo.prototype ์์ ์๋ง๋ ๋๊ตด๊น?**
Foo.prototype ๋ํ ๊ฐ์ฒด instance๋ค. key์ value๋ฅผ ๊ฐ์ก๋ค. ์๋น ๋ ์์ฑ์ ํจ์๋ค Foo.prototype์ ์๋น ๋ ๋๊ตฌ์ผ๊น?
์์๊ฒ๋ ์๋ง์ ์ ๋ณด๋ฅผ ๊ฐ์ง __proto__๊ฐ ์๋ค.
์๋ง์ ์ ๋ณด๊ฐ ๋์๋ค.
์ ๊น Object.prototype์ ํ์ธํ์.
์ด ์ ๋ณด๋ Foo.prototype. proto ์ Object.proto์ ๋๊ฐ๋ค.
์ด๋ฌํ ์ด์ ๋ Foo.prototype๋ new Object();๋ก ๋ง๋ค์ด์ง ํ๋์ intance์ด๊ธฐ ๋๋ฌธ์ด๋ค.
Foo.prototype.proto === Object.prototype;
Foo.prototype.__proto__ === Object.prototype; // true;๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋ง์ ์๋ง์ ์ ๋ณด์ธ Foo.prototype. proto ์ Object์ ์๋ด์ธ Object.prototype๊ณผ ๋์ผํ๋ค๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค. ๐คญ
์ง๊ธ ์ ๊ทผํ ์ํฉ์ ๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ฆฌ๊ฒ ๋๋ฉด ์ด๋ ๊ฒ ๋๋ ๊ฒ์ด๋ค. (์ด๊ฒ์ด ๋ง์ง๋ง ๊ทธ๋ฆผ์ด๊ธธ ๋น๋ค...)
๋จํธ์ Foo
๋จํธ์ ์๋ด๋ Foo.prototype
๋จํธ์ ์๋ด์ ์๋ง์ ์ ๋ณด๋ Foo.prototype. proto ๋ก ์ ๊ทผ
๋จํธ์ ์๋ด์ ์๋ง๋ ์ค์ Object.prototype ์ด๋ค. ์ํ ๐คง
๊ทธ๋ผ Object์ ์๋ด์ ์๋ง๋ ๋๊ตด๊น?
console.log(Object.prototype.__proto__) // null;์์คํ ์ null, Object์ ์๋ด๋..์ฅ๊ณผ ๋ง๋์..๋จน...(..)
๊ฐ์กฑ๊ด๊ณ๋ฅผ ์ง์ ํ์ธํด๋ณด์
๊ฐ์กฑ๊ด๊ณํ์ ์ด ๋๋๋ ๋ค์ ํ๋ฒ ํ์ธํ๊ณ ์ ํ๋ ์๊ตฌ๊ฐ ์๊ฒผ๋ค.
function Father() {}
var baby = new Father();
// __proto__๋ฅผ ์ด์ฉํด ์๋ง์๊ฒ ์ ๊ทผ
baby.__proto__ === Father.prototype;
// ์๋ง(prototype)๊ฐ ๊ฐ์ง constructor๋ฅผ ์ด์ฉํด ์๋น ์๊ฒ ์ ๊ทผ
baby.constructor === Father;
//__proto__ ๋ก ํ ๋จธ๋์๊ฒ๋ ์ ๊ทผ
baby.__proto__.__proto__ === Object.prototype;
//ํ ๋จธ๋๊ฐ ๋ง๋๊ฐ?๋ฅผ ์๋ง๋ก ์ฒดํฌํด๋ณด๋ฉด false๊ฐ ๋์จ๋ค.
baby.__proto__ === Object.prototype;prototype chain์ ์ต์ข Object๊น์ง ์ฌ๋ผ๊ฐ๋ค
function Foo() {}
var f = new Foo();
Object.prototype.haha = 123;
console.log(f.haha); // 123Inheritance(์์)์ด ์๋๋ผ Behavior Delegation(ํ๋์ ์์, ๋๋ฆฌ)์ด๋ค.
ํ์ํ ๋๋ง๋ค ๋ถํ์ ํ๋๊ฒ์ด์ง ์์ ๋ฐ์๊ฒ ์๋๋ค.
Last updated
Was this helpful?


