Use Constructor Functions - Lee-hyuna/33-js-concepts-kr GitHub Wiki
Use Constructor Functions
์ง๋ ์ฑํฐ์์ ์ฐ๋ฆฌ๋ object prototypes
๊ณผ Object.create
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ด์ผ๊ธฐํ์ต๋๋ค.
์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑ ํ ํ์๋ init
์ด๋ผ๋ ํจ์๋ฅผ ํธ์ถํ๋ค. ์ด init
ํจ์๋ ์ข
์ข
์๋ก์ด ๊ฐ์ฒด๋ฅผ "set up"ํ๊ธฐ ์ํด ์คํํ๊ธฐ๋ฅผ ์ํ๋ฉฐ, ๋๋ถ๋ถ์ ๊ฐ์ฒด ์งํฅ ์ธ์ด๋ ์ดinit
ํจ์์ ๊ฐ๋
์ ์ง์ ๊ตฌํํฉ๋๋ค. Javascript์์, ๋ด์ฅ๋ init
ํจ์๋ ์์ฑ์ ํจ์๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ, ํน๋ณํ Javascript ํค์๋new
๋ฅผ ์ฌ์ฉํ์ฌ ํธ์ถ ํ ์ ์์ต๋๋ค.
์์ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ค๋ฉด ๊ฐ์ฒด์ ๋ํด ์ํ๋ init
๊ธฐ๋ฅ์ ํฌํจํ๋ ๋
๋ฆฝํ ํจ์๋ฅผ ์์ฑํ๋ฉด๋ฉ๋๋ค. ์ด ํจ์๋ฅผ init
๋ผ๊ณ ๋ถ๋ฅด๋ ๋์ ์, ์ด ํจ์๋ ์ฐ๋ฆฌ ๊ฐ์ฒด์ class
์ด๋ฆ์ ๊ฐ์ง ๊ฒ์
๋๋ค. ๋ค์์ ์์ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ง๋ ์ฑํฐ์ pastry code
๋ฅผ ๋ค์ ์์ฑํ ๊ฒฝ์ฐ์ ๋ชจ์ต์
๋๋ค.
var Pastry = {
// initialize the pastry
init: function (type, flavor, levels, price, occasion) {
this.type = type;
this.flavor = flavor;
this.levels = levels;
this.price = price;
this.occasion = occasion;
},
...
}
์ด๋ ๊ฒ ๋ ๊ฒ์ ๋๋ค.
function Pastry(type, flavor, levels, price, occasion) {
this.type = type;
this.flavor = flavor;
this.levels = levels;
this.price = price;
this.occasion = occasion;
}
์ด์ ์ธ์คํด์คํํ๋ ค๋ฉด ํธ์ถํ๋ ๋์
Object.create(Pastry);
๊ทธ๋ฐ ๋ค์ init
ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค
new Pastry(type, flavor, levels, price, occasion);
๊ทธ๋ ์ง๋ง Pastry
๊ฐ์ฒด์ ์ํด ์ ์ ๋ ๋ค๋ฅธ ํจ์๋ ์ด๋ป์ต๋๊น? ์ฐ๋ฆฌ์ Pastry
์๋ describe
ํจ์๊ฐ ์์ต๋๋ค.
var Pastry = {
// initialize the pastry
init: function (type, flavor, levels, price, occasion) {
this.type = type;
this.flavor = flavor;
this.levels = levels;
this.price = price;
this.occasion = occasion;
},
// Describe the pastry
describe: function () {
var description = "The " + this.type + " is a " + this.occasion + " pastry, has a " + this.flavor + " flavor, " + this.levels + " layer(s), and costs " + this.price + ".";
return description;
}
};
์ด๊ฒ์ Prototype
์ด ๋ค์ ๋ค์ด์ค๋ ๊ณณ์
๋๋ค.
์ง๋ ์ฑํฐ์ธ Pastry
๊ฐ์ฒด๊ฐ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ชจ๋ Pastry
์ prototype ์ญํ ์ ํ์์ ๊ธฐ์ตํ์ญ์์ค. Pastry object
์์ ์ ์ํ init
, describe
์ ๊ฐ์ ๋ชจ๋ ํจ์๋ ์ฐ๋ฆฌ๊ฐ ์์ฑ ํ ๋Pastry
๋ฅผObject.create
์ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ํ๊ฐ ๋์ด์์ต๋๋ค.
๊ทธ๋ฌ๋ ์์ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ฝ๊ฐ ๋ค๋ฆ
๋๋ค. ์ฐ๋ฆฌ๋ ๋จ์ํ Pastry
์์ฑ์ ํจ์์ ์์ฑ์ ์ถ๊ฐ ํ ์ ์์ผ๋ฉฐ ์์ฑ์๊ฐ ์์ฑ ํ ๊ฐ์ฒด์ prototype๊ณผ ๋์ผํ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ class์ ์ธ์คํด์คํ๋ฅผ ๊ธฐ๋ํ๊ธฐ ์ด๋ ต์ต๋๋ค.
๋คํํ๋, ์์ฑ์ ํจ์๋ ์์ฑํ ๊ฐ์ฒด์ prototype์ ๋ํ ํน๋ณํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ง๋ ์ฑํฐ์์ prototype๊ณผ ๊ฐ์ด ์์ ๊ฐ๋ฅํ ์์ฑ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์ด์ ๋ ์์ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก ์ฐ๋ฆฌ๋ describe
ํจ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด Pastry
prototype์ ํ ๋นํฉ๋๋ค.
function Pastry(type, flavor, levels, price, occasion) {
this.type = type;
this.flavor = flavor;
this.levels = levels;
this.price = price;
this.occasion = occasion;
}
Pastry.prototype.describe = function () {
var description = "The " + this.type + " is a " + this.occasion + "pastry, has a " + this.flavor + " flavor, " + this.levels + " layer(s), and costs " + this.price + ".";
return description;
}
์ง๋ ์ฑํฐ์์, ์ฐ๋ฆฌ๋ ๋ชจ๋ ์๋ก์ด ๊ฐ์ฒด ์์ฑ์ ๋ ์ค๋ก ๋ง๋ค์์ต๋๋ค.
var muffin = Object.create(Pastry);
muffin.init("muffin", "blueberry", 1, "$2", "breakfast");
var cake = Object.create(Pastry);
cake.init("cake", "vanilla", 3, "$10", "birthday");
console.log(muffin.describe());
console.log(cake.describe());
์ด์ , ๊ฐ์ฒด ํจ์๋ฅผ ์ฌ์ฉํจ์ผ๋ก์, ์ฐ๋ฆฌ๋ ํ ์ค๋ก ์ฐ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ธ์คํด์คํ ํ์ฌ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๊ฒ ํ ์ ์์ต๋๋ค.
var muffin = new Pastry("muffin", "blueberry", 1, "$2", "breakfast");
var cake = new Pastry("cake", "vanilla", 3, "$10", "birthday");
console.log(muffin.describe());
console.log(cake.describe());
์์ฑ์ํจ์๋ฅผ ํธ์ถ ํ ๋๋ 'new'๋ฅผ ์์ด๋ฒ๋ฆฌ์ง ๋ง์ธ์!
์์ฑ์ํจ์์ ๊ด๋ จํ์ฌ ์ค์ํ ํฌ์ธํธ๊ฐ ์์ต๋๋ค.
pastry
๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ธฐ๋ฅผ ๊ธฐ๋ํ๋ฉฐ ์ผ๋ฐ ํจ์๋ก์ Pastry
ํจ์๋ฅผ ํธ์ถํ๋ ๋์ ์ , new
ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊น๋จน์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ์ฐ๋ฆฌ์ ์์ฑ์ํจ์๋ return
๋ฌธ์ ๊ฐ์ง๊ณ ์์ง ์๋ค๋ ๊ฒ์ ์๊ณ ์๋๋ผ๋ ๋ง์
๋๋ค.
๋ฐํ ๊ฐ์ ์ง์ ํ์ง ์๋ ํจ์์ ๋ฐํ ๊ฐ์ "undefined"์ด๋ฏ๋ก, ํน๋ณํ new
ํค์๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์ฑ์ ํจ์๋ฅผ ํธ์ถํ๋ฉด ๊ฐ๊ฒ ๋๋ ๊ฐ์
๋๋ค.
์ด๊ฒ์ ๋น์ ์ด๋ ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ๋น์ ์ ๊ฐ์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฒ๊ทธ๋ก ์ด์ด์ง๋ ๊ฒ์ ํํ๊ฒ ๋ณผ ์ ์์ต๋๋ค.
// gonna instantiate some sweet beignets...
var beignet = Pastry("beignet", "cream", 1, "$1.50", "anytime you want beignets");
console.log(beignet.describe());
> Uncaught TypeError: Cannot read property 'describe' of undefined
์ด๊ฒ์ ๊ฑฐ์ ํ์คํ ๋น์ ์ ํจ์๊ฐ ์คํจํ ์๋ ์์ต๋๋ค. ๋ง์ฝ์ ๋น์ ์๊ฒ ํ์ด์ด ์๋ค๋ฉด์!
๋ ๋์๊ณ ๋๋ฒ๊น
ํ๊ธฐ ์ด๋ ค์ด ์ฌ๊ธฐ์์ ์ํ์ ๋น์ ์ด callbeignet.describe()
๋ฅผ ํธ์ถํ ๋๊ฐ ์๋, ๋น์ ์ด new
ํค์๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ฐ์ฒด ํจ์๋ฅผ ํธ์ถํ ๋ ๋ฌด์ธ๊ฐ ์กฐ์ฉํ ๋ฐ์ํ๋ค๋ ๊ฒ์
๋๋ค.
๋น์ ์ด new
ํค์๋ ์์ด Pastry
ํจ์๋ฅผ ์คํํ ํ์ window.type
์ ๊ฐ์ ํ์ธํด๋ณด์ธ์.
var beignet = Pastry("beignet", "cream", 1, "$1.50", "anytime you want beignets");
window.type
> beignet
๋น์ ์ ์๋ง๋ window
๊ฐ์ฒด๊ฐ ์ต์ํ์ง ์์ ์๋ ์์ต๋๋ค. (์ฐ๋ฆฌ๋ ๋ค์ ์ฑํฐ์์ ์ข ๋ ๋ฐฐ์ธ ๊ฒ์
๋๋ค) ํ์ง๋ง, ์ด๊ฒ์ ๋น์ ์ ๋ชจ๋ ์นํ์ด์ง์ ๊ธฐ์ด์ ๊ทผ๋ณธ์ด๊ณ ๋ฌด์์์ ์ผ๋ก ํ๋กํผํฐ๋ค์ ํ ๋นํ๋ ๊ฒ์ ๋น์ ์ ํ๋ก๊ทธ๋จ์ ๊ต์ฅํ ์ํํ ๊ฒ์
๋๋ค.
ํนํ ๋น์ ์ด ์ฐ์ฐํ๋ ์ด๋ฏธ ์กด์ฌํ๋ ํ๋กํผํฐ๋ฅผ ๋ฎ์ด์ด๋ค๋ฉด ๋ง์
๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ค์ ์ฑํฐ์์ ์ค์ฝํ ๊ฐ๋
์ ๋ฐฐ์ฐ๊ณ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๋ฐฐ์ธ๋ ์ด๋ป๊ฒ ์ด๊ฒ์ด ๋ฐ์ํ๋์ง ์ฐ๋ฆฌ๋ ์ข ๋ ์ด์ผ๊ธฐ ๋๋ ๊ฒ์
๋๋ค.
์ง๊ธ์ ๋น์ ์ด ๊ฐ์ฒด๋ฅผ ์์ฑ์ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด๊ธฐํํ ๋ new
ํค์๋๋ฅผ ์๋ตํ ์๋ ์๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ธ์.