Prototype in Javascript - Lee-hyuna/33-js-concepts-kr GitHub Wiki
๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ํจ์๋ EMPTY(๊ธฐ๋ณธ๊ฐ)์ธ ํ๋กํ ํ์ ์ผ๋ก ์์ฑ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์๋ค. ๊ฑฐ๊ธฐ์ ํน์ฑ๊ณผ ๋ฐฉ๋ฒ์ ์ถ๊ฐํ ์ ์๋ค.
Note: ๋ชจ๋ ํจ์๋ ์์ฑ์ ํจ์์ด๋ค.
ํจ์ x
๊ฐ ์๊ณ x1
์ด x
์ prototype์ ์ด์ด๋ฐ์ผ๋ฏ๋ก x
์ ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค๊ณ ํ์.
var x = function(j) {
this.i = 0;
this.j = j;
this.GetJ = function() {
return this.j;
}
}
var x1 = new x(2);
console.log(x1);
// > x {i: 0, j: 2, GetJ: ฦ}
console.log(x1.GetJ());
// > 2
Note: ์์ฑ์ ํจ์์ ๊ดํ
this
๋ ์์ฑ์ ํจ์๊ฐ ํฌํจ๋ ํจ์๋ฅผ ์ง์นญํ๋ ๊ฒ์ด ์๋๋ผ ์์ฑ์ ํจ์์ ์ํด ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
์ด์ ์ํ๋ ๊ฐ์ฒด๋ก ๋ง๋ค ์ ์์ผ๋ฉฐ x
์์ ์์ฑ๋ ๋ชจ๋ ๊ฐ์ฒด์๋ GetJ()
๋ฉ์๋๊ฐ ๋ถ์ฐฉ๋์ด ์์ผ๋ฉฐ, GetJ()
๋ฉ์๋๋ ๋ถ๋ ์ํ์ด๋ค. ์ด์ ๋ํ ํด๊ฒฐ์ฑ
์ ํ๋กํ ํ์
์ด๋ค. GetJ()
๋ฐฉ๋ฒ์ x
์ ํ๋กํ ํ์
์ผ๋ก ๊ฐ์ ธ๊ฐ๋ค.
var x = function(j) {
this.i = 0;
this.j = j;
}
x.prototype.GetJ = function() {
return this.j;
}
var x1 = new x(2);
console.log(x1);
// > x {i: 0, j: 2}
console.log(x1.GetJ());
// > 2
ํ์ง๋ง x1
์๋ GetJ()
์ด ์๋ค๋ ๊ฒ์ด ์ ์ผํ ์ฐจ์ด์ ์ด์ ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํ๋ฏ๋ก ์ฌ์ ํ ์ ํํ ์ถ๋ ฅ์ ์ป์ ์ ์๋ค. ๋ฐ๋ผ์ ํ๋กํ ํ์
์ฒด์ธ์ ์ฐพ์๋ณด๊ณ (๋ถ๋ชจ ๋ถ๋ชจ๊น์ง ์ฌ๋ผ๊ฐ์!) GetJ()
์ ์ฐพ๋๋ค.
Note: Prototype Chain Javascript์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๋ง์คํฐ ๊ฐ์ฒด์์ ์์ฑ๋๋ค.
์ฌ๊ธฐ์ ์ฃผ๋ชฉํ ์ ์ x -> function -> object
๋ฐ๋ผ์ x
์์ ์ด๋ค ๋ฐฉ๋ฒ์ ํธ์ถํ๋ฉด, ๊ทธ perticularํจ์์ x
๊ฐ ์์ง ์์ผ๋ฉด, ๋์ค์ ์ฐพ์ ๋๊น์ง ์์๋๋ก ํ์๋๋ค.
ํจ์์ prototype chain์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ, undefined
์ํ๋ก ํ์๋ฉ๋๋ค.
์๋ฅผ ๋ค๋ฉด,
var x = function() {
}
console.dir(x);
๊ทธ๋์ ํ๋กํ ํ์ ์ฒด์ธ ์ ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค. ์ฌ๊ธฐ์ ํธ์ถ์ ํ๊ฒ ๋๋ฉด
console.log(x.toString());
// > function() {
// >
// > }
์ฌ๊ธฐ์ x
๋ toString()
์ ์ฌ์ฉํ ํ์๊ฐ ์์ง๋ง ์๋ก ์ฌ๋ผ๊ฐ๋ณด๋ฉด prototype chain์ ์๋ค.
Javascipt๋ Java์ ๊ฐ์ Class defination
์ ๊ฐ์ง๊ณ ์์ง ์๋๋ค. ์ฌ๊ธฐ์ Base class
์์ ์๋ธ ํด๋์ค๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค.
//Baseclass
var Bookshop = function() {
this.cost = 100;
}
Bookshop.prototype.bill = function() {
console.log('Your Bill is: $'+ this.cost);
}
Bookshop
์ Base Class๋ก bill
์ด prototype์ผ๋ก ์ํด์๋ค.
//Subclass
var BuyBook = function(title,cost) {
Bookshop.call(this); // Statement 1
this.title = title;
if(cost)
this.cost = cost ;
}
BuyBook.prototype = Object.create(Bookshop.prototype); // Statement 2
BuyBook.prototype.constructor = BuyBook; // Statement 3
Bookshop
์ Base Class๋ก BuyBook
์ ๊ทธ์ Sub Class๋ก ์ํด์๋ค.
Explaination
Bookshop.call(this)
์ด ๋ผ์ธ์ ์์ฑ์๋ฅผ callํ ๋ vlaue๊ฐ์ผ๋ก this
๋ฅผ ๋๊ฒจ์ฃผ์๋ค. ๊ทธ๋์ `BuyBook : this = { this.cost = 100; }๊ฐ ๋๋ค.
BuyBook.prototype = Object.create(Bookshop.prototype);
์ด ๋ผ์ธ์ Bookshop.prototype
์ ์ด๊ธฐ๊ฐ์ ์
ํ
ํด์ค๋ค.
BuyBook.prototype.constructor = BuyBook;
์ด ๋ผ์ธ์ BuyBook
์์ฑ์ ํจ์๋ฅผ ์
ํ
ํด์ค๋ค. (BuyBook์ ๋ฉ์๋์ด๋ค)
var person_1 = new BuyBook('GOT', 200);
var person_2 = new BuyBook('Harry Potter');
person_1.bill();
//> Your Bill is: $200
person_2.bill();
//> Your Bill is: $100
์ด๋ ๊ฒ ํ๋ฉด ์์์ ์ํํ ์ ์๋ค. BuyBook.protype
์์ ์ ๋ฉ์๋๋ฅผ ์ ์ํ์ฌ bill()
๋ฉ์๋๋ฅผ ๋ฎ์ด์ธ ์๋ ์๋ค. ์๋ฅผ๋ค๋ฉด BuyBook.prototype.bill = function() { }
์ด๋ ๊ฒ!
๐