์์
- ECMAScript์์๋ ๊ตฌํ ์์๋ง ์ง์ํ๋ฉฐ ๊ตฌํ ์์์ ๋๊ฐ ํ๋กํ ํ์ ์ฒด์ธ์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค.
ํฌ๋กํ ํ์ ์ฒด์ธ
- ํ๋กํ ํ์ ์ฒด์ธ์ ๊ธฐ๋ณธ ์์ด๋์ด๋ ํ๋กํ ํ์ ๊ฐ๋ ์ ์ด์ฉํด ๋ ๊ฐ์ง ์ฐธ์กฐ ํ์ ์ฌ์ด์์ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์์ํ๋ค๋ ๊ฒ์ ๋๋ค.
- ๋ชจ๋ ์์ฑ์์๋ ์์ฑ์ ์์ ์ ๊ฐ๋ฆฌํค๋
ํ๋กํ ํ์ ๊ฐ์ฒด(prototype)
๊ฐ ์์ผ๋ฉฐ ์ธ์คํด์ค๋ํ๋กํ ํ์ ์ ๊ฐ๋ฆฌํค๋ ๋ด๋ถ ํฌ์ธํฐ(__proto__)
๊ฐ ์์ต๋๋ค. - ๊ทธ๋ ๋ค๋ฉด ํ๋กํ ํ์ ์ด ์ฌ์ค ๋ค๋ฅธ ํ์ ์ ์ธ์คํด์ค๋ผ๋ฉด ์ด๋จ๊น์? ์ด๋ฐ ๊ฒฝ์ฐ์๋ ํ๋กํ ํ์ (A) ์์ฒด์ ๋ค๋ฅธ ํ๋กํ ํ์ (B)์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๊ฐ ์์ ๊ฒ์ด๋ฉฐ, B์๋ ๋ ๋ค๋ฅธ ์์ฑ์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๊ฐ ์์ ๊ฒ๋๋ค.
function SuperType() {
this.property = true;
}
SuperType.prototype.getSuperValue = function() {
return this.property;
};
function SubType() {
this.subproperty = false;
}
// inherit from SuperType
SubType.prototype = new SuperType();
// ์ ํ๋กํ ํ์
์ SuperType์ ์ธ์คํด์ค์ด๋ฏ๋ก SuperType ์ธ์คํด์ค๊ฐ ๊ฐ์ง ํ๋กํผํฐ์ ๋ฉ์๋ ์ธ์ SuperType์ ํ๋กํ ํ์
์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ ๊ฐ์ง๋๋ค.
SubType.prototype.getSubValue = function() {
return this.subproperty;
};
var instance = new SubType();
console.log(instance.getSuperValue()); //true
SubType
์ ๊ธฐ๋ณธ ํ๋กํ ํ์ ๋์ ์ ํ๋กํ ํ์ (new SuperType()
)์ด ํ ๋น๋์์ต๋๋ค.- ์ ํ๋กํ ํ์
์
SuperType
์ ์ธ์คํด์ค์ด๋ฏ๋กSuperType
์ธ์คํด์ค๊ฐ ๊ฐ์ง ํ๋กํผํฐ์ ๋ฉ์๋ ์ธ์ SuperType์ ํ๋กํ ํ์ ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ ๊ฐ์ง๋๋ค. - ์ฆ, instance ๋ณ์๋
SubType.prototype
์ ๊ฐ๋ฆฌํค๊ณSubtype.prototype
์Super.prototype
์ ๊ฐ๋ฆฌํต๋๋ค. getSuperValue()
๋ฉ์๋๋SuperType.prototype
๊ฐ์ฒด์ ๋จ์ง๋งproperty
๋SubType.prototype
์ ์กด์ฌํจ์ ๋์ฌ๊ฒจ ๋ณด์ญ์์ค.- ์ด๋ ๊ฒ ๋๋ ๊ฒ์
getSuperValue()
์ด ํ๋กํ ํ์ ๋ฉ์๋์ด๋ฉฐproperty
๋ ์ธ์คํด์ค ํ๋กํผํฐ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.SubType.prototype
์SuperType
์ ์ธ์คํด์ค ์ด๋ฏ๋กproperty
๋SubType.prototype
์ ์ ์ฅ๋ฉ๋๋ค. SubType.prototype
์constructor
ํ๋กํผํฐ๋ฅผ ๋ฎ์ด์ผ์ผ๋ฏ๋กinstance.construcor
๊ฐSuperType
์ ๊ฐ๋ฆฌํค๋ ์ ๋ ์ดํด๋ณด์ญ์์ค.instance.getSuperValue()
๋ฅผ ํธ์ถํ๋ฉด 3๋จ๊ณ๋ก ๊ฒ์ํฉ๋๋ค. 1) ์ธ์คํด์ค์์, 2) SubType.prototype์์ 3) SuperType.prototype์์ ๊ฒ์ํ๋ฉฐ 3๋จ๊ณ์์ ๋ฉ์๋๋ฅผ ์ฐพ์ต๋๋ค.
๊ธฐ๋ณธ ํ๋กํ ํ์
- ๋ชจ๋ ์ฐธ์กฐ ํ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋กํ ํ์ ์ฒด๋๋ฅด ํตํด Object๋ฅผ ์์ํฉ๋๋ค.
- ํจ์์ ๊ธฐ๋ณธ ํ๋กํ ํ์ ์ Object์ ์ธ์คํด์ค์ด๋ฏ๋ก ํจ์์ ๋ด๋ถ ํ๋กํ ํ์ ํฌ์ธํฐ๋ Object.prototype์ ๊ฐ๋ฆฌํต๋๋ค.
function Supertype() {}
function Object() {}
Object.prototype.constructor = Object;
Supertype.prototype.__proto__ === Object.prototype;
ํ๋กํ ํ์ ๊ณผ ์ธ์คํด์ค ์ฌ์ด์ ๊ด๊ณ
-
ํ๋กํ ํ์ ๊ณผ ์ธ์คํด์ค ์ฌ์ด์ ๊ด๊ณ๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์์๋ณผ ์ ์์ต๋๋ค.
- ์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ์ instanceof ์ฐ์ฐ์ ์ ๋๋ค. instanceof ์ฐ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ธ์คํด์ค ์์ฑ์๊ฐ ํ๋กํ ํ์ ์ฒด์ธ์ ์กด์ฌํ ๋ true๋ฅผ ๋ฐํํฉ๋๋ค.
console.log(instance instanceof Object); //true
console.log(instance instanceof SuperType); //true
console.log(instance instanceof SubType); //true
- ๋๋ฒ์งธ ๋ฐฉ๋ฒ์
isPrototypeOf()
๋ฉ์๋์ ๋๋ค. ์ฒด์ธ์ ์กด์ฌํ๋ ๊ฐ ํ๋กํ ํ์ ์ ๋ชจ๋ isPrototypeOf() ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๋๋ฐ ์ด ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ฒด์ธ์ ์กด์ฌํ๋ ์ธ์คํด์ค์์ true๋ฅผ ๋ฐํํฉ๋๋ค.
console.log(Object.prototype.isPrototypeOf(instance)); //true
console.log(SuperType.prototype.isPrototypeOf(instance)); //true
console.log(SubType.prototype.isPrototypeOf(instance)); //true
๋ฉ์๋
- ํ์ํ์ (subtype)์์ ์์ ํ์ (supertype)์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋(๋ฉ์๋ ๋ฎ์ด์ฐ๊ธฐ)ํ๊ฑฐ๋ ์์ ํ์ ์ ์กด์ฌํ์ง ์๋ ๋ฉ์๋๋ฅผ ์ ์ํด์ผ ํ ๋๊ฐ ๋ง์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ๋ฐ๋์ ํ๋กํ ํ์ ์ด ํ ๋น๋ ๋ค์ ํ์ํ ๋ฉ์๋๋ฅผ ํ๋กํ ํ์ ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
- ์๋ ์์ ์์ ์ค์ํ ์ ์ ๋ ๋ฉ์๋๊ฐ ๋ชจ๋ ํ๋กํ ํ์ ์ด SuperType์ ์ธ์คํด์ค๋ก ํ ๋น๋ ๋ค์ ์ ์๋์๋ค๋ ์ .
function SuperType() {
this.property = true;
}
SuperType.prototype.getSuperValue = function() {
return this.property;
};
function SubType() {
this.subproperty = false;
}
//inherit from SuperType
SubType.prototype = new SuperType();
//new method
SubType.prototype.getSubValue = function() {
return this.subproperty;
};
//override existing method
SubType.prototype.getSuperValue = function() {
return false;
};
var instance = new SubType();
console.log(instance.getSuperValue()); //false
- ์ฒซ๋ฒ์งธ ๋ฉ์๋์ธ
getSubValue()
๋SubType
์ ์ถ๊ฐํ ๋ฉ์๋์ ๋๋ค. ๋๋ฒ์งธ ๋ฉ์๋์ธgetSuperVlaue()
๋ ํ๋กํ ํ์ ์ฒด์ธ์ ์ด๋ฏธ ์กด์ฌํ์ง๋งinstance
์์ ๊ธฐ์กด ๋ฉ์๋๋ฅผ ๊ฐ๋ ธ์ต๋๋ค. - ์ค์ํ์ ์ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์จ์ ํ๋กํ ํ์ ๋ฉ์๋๋ฅผ ๋ง๋ค๋ฉด ์ฒด์ธ์ ๋ฎ์ด์ฐ๋ ๊ฒฐ๊ณผ๊ฐ ๋๋ฏ๋ก ํ๋กํ ํ์ ๊ณผ ์ฒด์ธ๊ณผ ํจ๊ป ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
function SuperType() {
this.property = true;
}
SuperType.prototype.getSuperValue = function() {
return this.property;
};
function SubType() {
this.subproperty = false;
}
//inherit from SuperType
SubType.prototype = new SuperType();
// ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ ค๋ ์๋ ์์ค์ ๋ฌดํจํ ํฉ๋๋ค.
SubType.prototype = {
getSubValue: function() {
return this.subproperty;
},
someOtherMethod: function() {
return false;
},
};
var instance = new SubType();
console.log(instance.getSuperValue()); //error!
- ์ด๋ ๊ฒ ํ๋ฉด ์ด์ ํ๋กํ ํ์
์๋
SuperType
์ ์ธ์คํด์ค๊ฐ ์๋๋ผ Object์ ์ธ์คํด์ค๊ฐ ๋ค์ด์์ผ๋ฏ๋ก ํ๋กํ ํ์ ์ฒด์ธ์ด ๋์ด์ ธ์SubType
๊ณผSuperType
์ฌ์ด์๋ ์๋ฌด ๊ด๊ณ๋ ์์ต๋๋ค.
ํ๋กํ ํ์ ์ฒด์ธ์ ๋ฌธ์
- ํ๋กํ ํ์ ์ฒด์ธ์ ๊ฐ๋ ฅํ ์์ ๋ฐฉ๋ฒ์ด์ง๋ง ๋ฌธ์ ๋ ์์ต๋๋ค. ์ฃผ์๋ฌธ์ ๋ ์ฐธ์กฐ๊ฐ์ ํฌํจํ ํ๋กํ ํ์ ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
- ํ๋กํ ํ์ ํ๋กํผํฐ์ ๋ค์ด์๋ ์ฐธ์กฐ ๊ฐ์ด ๋ชจ๋ ์ธ์คํด์ค์์ ๊ณต์ ๋๋ค๋ ์ฌ์ค์ ์๊ธฐํ์ญ์์ค.
- ์ด ๋๋ฌธ์ ํ๋กํผํฐ๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋กํ ํ์ ๋์ ์์ฑ์์ ์ ์ํฉ๋๋ค. ํ๋กํ ํ์ ์ผ๋ก ์์์ ๊ตฌํํ๋ฉด ํ๋กํ ํ์ ์ด ๋ค๋ฅธ ํ์ ์ ์ธ์คํด์ค๊ฐ ๋๋ฏ๋ก ์ฒ์์ ์ธ์คํด์ค ํ๋กํผํฐ์๋ ๊ฒ๋ค์ด ํ๋กํ ํ์ ํ๋กํผํฐ๋ก ๋ฐ๋๋๋ค. (์ฆ, ๊ณต์ ๋ฅผ ์ํ๋ ค๊ณ ํ ์์ฑ(ํ๋กํผํฐ)๋ค์ด ํ๋กํ ํ์ ์ฒด์ธ์ ์ด์ฉํจ์ผ๋ก์จ ๊ณต์ ํ๊ฒ ๋๋ค. )
function SuperType() {
this.colors = ["red", "blue", "green"];
}
// ๊ณต์ ๋ฅผ ์ํ๋ ค๊ณ ๋ง๋ค์๋ color๋ฐฐ์ด..
function SubType() {}
//inherit from SuperType
SubType.prototype = new SuperType();
// ์๋ธํ์
์ ํ๋กํ ํ์
์ ์๋ก์ด ์์ฑ์ ์ ์
// ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๊ณ SuperType()์ ์๋ color๊ฐ์ ์๋ก์ด ๊ฐ์ฒด ์์ ์ํ๊ฒ ๋๊ณ
// ํด๋น ๊ฐ์ฒด๋ฅผ SubType ํ๋กํ ํ์
์ ๋ฐํ.
// SubType ํ๋กํ ํ์
์ SubType์ ์ธ์คํด์ค์ ๋ชจ๋ ๊ณต์ ํ๋ ์ฑ์ง.
// ์ฆ, ๊ณต์ ๋ฅผ ์ํ๋ ค๊ณ ๋ง๋ color๋ฐฐ์ด์ SubType์ธ์คํด์ค์ ๋ชจ๋ ๊ณต์ ํ๋ ์ํฉ์ด ์๊น
var instance1 = new SubType();
instance1.colors.push("black");
console.log(instance1.colors); //"red,blue,green,black"
var instance2 = new SubType();
console.log(instance2.colors); //"red,blue,green,black"
- ๊ฒฐ๊ตญ
SubType
์ ๋ชจ๋ ์ธ์คํด์ค์์color
ํ๋กํผํฐ๋ฅผ ๊ณต์ ํ๊ฒ ๋์ดinstance1.colors
๋ฅผ ์์ ํ๋ฉดinstance2.colors
์๋ ๋ฐ์์ด ๋ฉ๋๋ค. - ๋๋ฒ์งธ ๋ฌธ์ ๋ ํ์ ํ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋ ์์ ํ์ ์์ฑ์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ ๋ฐฉ๋ฒ์ ์๋ค.
์์ฑ์ ํ์น๊ธฐ
- ๊ธฐ๋ณธ ์์ด๋์ด๋ ๋งค์ฐ ๋จ์ํฉ๋๋ค. ํ์ํ์
์์ฑ์ ์์์ ์์ ํ์
์์ฑ์๋ฅผ ํธ์ถํ๋ ๊ฒ๋๋ค. ํจ์๋ ๋จ์ํ ์ฝ๋๋ฅผ ํน์ ์ปจํ
์คํธ์์ ์คํํ๋ ๊ฐ์ฒด์ผ ๋ฟ์์ ์ผ๋์ ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์๋ก ์์ฑํ ๊ฐ์ฒด์์
apply()
์call()
๋ฉ์๋๋ฅผ ํตํด ์์ฑ์๋ฅผ ์คํํ ์ ์์์ด ์ดํด๋ ๊ฒ์ ๋๋ค.
function SuperType() {
this.colors = ["red", "blue", "green"];
}
function SubType() {
//inherit from SuperType
SuperType.call(this);
}
var instance1 = new SubType();
instance1.colors.push("black");
console.log(instance1.colors); //"red,blue,green,black"
var instance2 = new SubType();
console.log(instance2.colors); //"red,blue,green"
- ์ด ์ฝ๋๋
SuperType()
ํจ์์ ๋ค์ด์๋ ๊ฐ์ฒด ์ด๊ธฐํ ์ฝ๋ ์ ์ฒด๋ฅผSubType
๊ฐ์ฒด์์ ์คํํ๋ ํจ๊ณผ๊ฐ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ชจ๋ ์ธ์คํด์ค๊ฐ ์์ ๋ง์ colors ํ๋กํผํฐ๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
๋งค๊ฐ๋ณ์ ์ ๋ฌ
- ์์ฑ์ ํ์น๊ธฐ ํจํด์ ํ์ ํ์ ์ ์์ฑ์ ์์์ ์์ ํ์ ์ ์์ฑ์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ ์ ์๋๋ฐ ์ด๋ ์์ฑ์ ํ์น๊ธฐ ํจํด์ด ํ๋กํ ํ์ ์ฒด์ธ๋ณด๋ค ๋์์ ์ค ํ๋์ ๋๋ค.
function SuperType(name) {
this.name = name;
}
function SubType() {
//inherit from SuperType passing in an argument
SuperType.call(this, "Nicholas");
//instance property
this.age = 29;
}
var instance = new SubType();
console.log(instance.name); //"Nicholas";
console.log(instance.age); //29
- ์ด ์ฝ๋์์
SuperType
์์ฑ์๋ ๋งค๊ฐ๋ณ์๋ก name ํ๋๋ฅผ ๋ฐ๊ณ ๋จ์ํ ํ๋กํผํฐ์ ํ ๋นํ๊ธฐ๋ง ํฉ๋๋ค.SubType
์์ฑ์ ๋ด์์SuperType
์์ฑ์๋ฅผ ํธ์ถํ ๋ ๊ฐ์ ์ ๋ฌํ ์ ์๋๋ฐ, ์ด๋SubType
์ธ์คํด์ค์name
ํ๋กํผํฐ๋ฅผ ์ง์ ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋ฉ๋๋ค.
์์ฑ์ ํ์น๊ธฐ ํจํด์ ๋ฌธ์
- ์์ฑ์ ํ์น๊ธฐ ํจํด๋ง ์ฌ์ฉํ๋ฉด ์ปค์คํ ํ์ ์ ์์ฑ์ ํจํด์ ์ธ๋์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์๋ฉ๋๋ค. ๋ฉ์๋๋ฅผ ์์ฑ์ ๋ด๋ถ์์๋ง ์ ์ํด์ผ ํ๋ฏ๋ก ํจ์ ์ฌ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํด์ง๋๋ค. ๊ฒ๋ค๊ฐ ์์ ํ์ ์ ํ๋กํ ํ์ ์ ์ ์๋ ๋ฉ์๋๋ ํ์ํ์ ์์ ์ ๊ทผํ ์ ์๋ ๋ฌธ์ ๋ ์์ต๋๋ค.
์กฐํฉ์์
- ์กฐํฉ์์์ ํ๋กํ ํ์ ์ฒด์ธ๊ณผ ์์ฑ์ ํ์น๊ธฐ ํจํด์ ์กฐํฉํด ๋ ํจํด์ ์ฅ์ ๋ง์ ์ทจํ๋ ค๋ ์ ๊ทผ๋ฒ์ ๋๋ค. ๊ธฐ๋ณธ ์์ด๋์ด๋ ํ๋กํ ํ์ ์ฒด์ธ์ ์จ์ ํ๋กํ ํ์ ์ ์กด์ฌํ๋ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์์ํ๊ณ ์์ฑ์ ํ์น๊ธฐ ํจํด์ผ๋ก ์ธ์คํด์ค ํ๋กํผํฐ๋ฅผ ์์ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ๋กํ ํ์ ์ ๋ฉ์๋๋ฅผ ์ ์ํด์ ํจ์๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๊ณ ๊ฐ ์ธ์คํด์ค๊ฐ ๊ณ ์ ํ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ์๋ ์์ต๋๋ค.
function SuperType(name) {
this.name = name;
this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function() {
console.log(this.name);
};
function SubType(name, age) {
SuperType.call(this, name);
this.age = age;
}
SubType.prototype = new SuperType();
SubType.prototype.sayAge = function() {
console.log(this.age);
};
var instance1 = new SubType("Nicholas", 29);
instance1.colors.push("black");
console.log(instance1.colors); //"red,blue,green,black"
instance1.sayName(); //"Nicholas";
instance1.sayAge(); //29
var instance2 = new SubType("Greg", 27);
console.log(instance2.colors); //"red,blue,green"
instance2.sayName(); //"Greg";
instance2.sayAge(); //27
- ํ๋กํ ํ์
์ฒด์ธ๊ณผ ์์ฑ์ ํ์น๊ธฐ ํจํด์ ๋จ์ ์ ๋ชจ๋ ํด๊ฒฐํ ์กฐํจ์์์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฅ ์์ฃผ ์ฐ์ด๋ ์์ ํจํด์
๋๋ค. ์กฐํฉ์์์
instanceOf()
์ isPrototypeOf()์์๋ ์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
ํ๋กํ ํ์ ์์
- ์ด ๋ฐฉ๋ฒ์ ํ๋กํ ํ์ ์ ์จ์ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๋ฐ๋์ ์ปค์คํ ํ์ ์ ์ ์ํ ํ์๋ ์๋ค๋ ๋ฐ์ ์ถ๋ฐํฉ๋๋ค. ํฌ๋กํฌ๋๊ฐ ์๊ฐํ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
function object(o) {
function F() {}
F.prototype = o;
return new F();
}
object()
ํจ์๋ ์์ ์์ฑ์๋ฅผ ๋ง๋ค์ด ์ฃผ์ด์ง ๊ฐ์ฒด(๋งค๊ฐ๋ณ์ o)๋ฅผ ์์ฑ์์ ํ๋กํ ํ์ ์ผ๋ก ํ ๋นํ ๋ค์ ์์ ์์ฑ์์ ์ธ์คํด์ค๋ฅผ ๋ฐํํฉ๋๋ค. ์์ฝํ๋ฉด object()๋ ์ฃผ์ด์ง ๊ฐ์ฒด์ ์ฌ๋ณธ ์ญํ ์ ํฉ๋๋ค.
var person = {
name: "Nicholas",
friends: ["Shelby", "Court", "Van"],
};
var anotherPerson = object(person);
anotherPerson.name = "Greg";
anotherPerson.friends.push("Rob");
var yetAnotherPerson = object(person);
yetAnotherPerson.name = "Linda";
yetAnotherPerson.friends.push("Barbie");
console.log(person.friends); // "Shelby,Court,Van,Rob,Barbie"
- ์ด ๋ฐฉ๋ฒ์์๋ ์ผ๋จ ๋ค๋ฅธ ๊ฐ์ฒด์ ๊ธฐ๋ฐ์ด ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ญ๋๋ค. ๊ธฐ๋ฐ ๊ฐ์ฒด๋ฅผ object()์ ๋๊ธด๋ค์ ๊ฒฐ๊ณผ ๊ฐ์ฒด๋ฅผ ์ ์ ํ ์์ ํด์ผ ํฉ๋๋ค. ์ด ์์ ์์๋ person ๊ฐ์ฒด๊ฐ ๊ธฐ๋ฐ ๊ฐ์ฒด์ด๋ฏ๋ก object()ํจ์์ ๋๊ฒจ์ ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ๋ฐ์์ต๋๋ค. ์ ๊ฐ์ฒด์ ํ๋กํ ํ์ ์ person์ ๋๋ค.
- ECMAScript 5ํ์ ํ๋กํ ํ์
์์์ ๊ฐ๋
์ ๊ณต์์ ์ผ๋ก ์์ฉํ์ฌ
Object.create()
๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ์ด ๋ฉ์๋๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋๊ฐ ๋ฐ๋๋ฐ ํ๋๋ ๋ค๋ฅธ๊ฐ์ฒด์ ํ๋กํ ํ์ ์ด ๋ ๊ฐ์ฒด์ด๋ฉฐ, ์ต์ ์ธ ๋ค๋ฅธ ํ๋๋ ์ ๊ฐ์ฒด์ ์ถ๊ฐํ ํ๋กํผํฐ๋ฅผ ๋ด์ ๊ฐ์ฒด์ ๋๋ค. ๋งค๊ฐ๋ณ์๋ฅผ ํ๋ ์ฐ๋ฉดObject.creat()
๋object()
๋ฉ์๋์ ๋๊ฐ์ด ๋์ํฉ๋๋ค.
var person = {
name: "Nicholas",
friends: ["Shelby", "Court", "Van"],
};
var anotherPerson = Object.create(person);
anotherPerson.name = "Greg";
anotherPerson.friends.push("Rob");
var yetAnotherPerson = Object.create(person);
yetAnotherPerson.name = "Linda";
yetAnotherPerson.friends.push("Barbie");
console.log(person.friends); // "Shelby,Court,Van,Rob,Barbie"
Object.create()
์ ๋๋ฒ์งธ ๋งค๊ฐ๋ณ์๋Object.defineProperties()
์ ๋๋ฒ์งธ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ํ์์ ๋๋ค. ์ฆ ์ถ๊ฐํ ํ๋กํผํฐ๋ง๋ค ์์ ์์ ํจ๊ป ์ ์ํ๋ ํํ์ ๋๋ค. ์ด๋ฐ์์ผ๋ก ์ถ๊ฐํ ํ๋กํผํฐ๋ ๋ชจ๋ ํ๋กํ ํ์ ๊ฐ์ฒด์ ์๋ ๊ฐ์ ์ด๋ฆ์ ํ๋กํผํฐ๋ฅผ ๊ฐ๋ฆฝ๋๋ค.
var person = {
name: "Nicholas",
friends: ["Shelby", "Court", "Van"],
};
var anotherPerson = Object.create(person, {
name: {
value: "Greg",
},
});
console.log(anotherPerson.name); // "Greg"
- ํ๋กํ ํ์ ์์์ผ๋ก ๋ง๋ ๊ฐ์ฒด๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋น์ทํ๊ฒ ๋์ํ์ง๋ง ์์ฑ์๋ฅผ ๋ค ๋ฐ๋ก ๋ง๋ค ํ์๋ ์๋ค๋ ์ ์์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
- ํ๋กํ ํ์ ํจํด๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฐธ์กฐ ๊ฐ์ ํฌํจํ๋ ํ๋กํผํฐ๋ค์ ๋ชจ๋ ๊ทธ ๊ฐ์ ๊ณต์ ํจ์ ์ ๋ ํ์ญ์์ค.
๊ธฐ์ ์์
๊ธฐ์์์
์ด๋ ๊ฐ๋ ์ ํ๋กํ ํ์ ์์๊ณผ ๋ฐ์ ํ ์ฐ๊ด๋, ์ธ๊ธฐ์๋ ํจํด์ด๋ค.- ๊ธฐ๋ณธ ์์ด๋์ด๋ ๊ธฐ์ ์์ฑ์๋ ํฉํฐ๋ฆฌ ํจํด๊ณผ ๋น์ทํฉ๋๋ค. ์์์ ๋ด๋นํ ํจ์๋ฅผ ๋ง๋ค๊ณ , ์ด๋ค ์์ผ๋ก๋ ๊ฐ์ฒด๋ฅผ ํ์ฅํด์ ๋ฐํํ๋ค๋ ๊ฒ๋๋ค. ๊ธฐ์ ์์ ํจํด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
function createAnother(original) {
var clone = object(original);
clone.sayHi = function() {
alert("hi");
};
return clone;
}
- ๊ธฐ๋ฐ ๊ฐ์ฒด
original
์object()
ํจ์์ ๋๊ธด ๊ฒฐ๊ณผ๋ฅผclone
์ ํ ๋นํฉ๋๋ค. ๋ค์์ผ๋กclone
๊ฐ์ฒด์sayHi()
๋ผ๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ํ์ฉํฉ๋๋ค.
var person = {
name: "Nicholas",
friend: ["Shelby", "Court", "Van"],
};
var anotherPerson = creatAnother(person);
anotherPerson.sayHi(); // "hi"
- ๊ธฐ์ ์์ ํจํด์ ๊ฐ์ฒด๋ฅผ ์ฃผ๋ก ๊ณ ๋ คํ ๋ ์ฌ์ฉํ ํจํด์ด์ง ์ปค์คํ ํ์ ๊ณผ ์์ฑ์์ ์ด์ธ๋ฆฌ๋ ํจํด์ ์๋๋๋ค.
- ๊ธฐ์ ์์์ ๊ผญ
object()
๋ฉ์๋๊ฐ ํ์ํ ๊ฑด ์๋๋๋ค. ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์๋ ๋ชจ๋ ์ด ํจํด์ ์ธ ์ ์์ต๋๋ค.
๊ธฐ์ ์กฐํฉ ์์
- ์กฐํฉ ์์์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฅ ์์ฃผ ์ฐ์ด๋ ์์ ํจํด์ด์ง๋ง ๋นํจ์จ์ ์ธ ๋ฉด๋ ์์ต๋๋ค.
- ์ด ํจํด์์ ๊ฐ์ฅ ๋นํจ์จ์ ์ธ ๋ถ๋ถ์ ์์ ํ์ ์์ฑ์๊ฐ ํญ์ ๋ ๋ฒ ํธ์ถ๋๋ค๋ ์ ์ ๋๋ค. ํ ๋ฒ์ ํ์ ํ์ ์ ํ๋กํ ํ์ ์ ์์ฑํ๊ธฐ ์ํด, ๋ค๋ฅธ ํ๋ฒ์ ํ์ ํ์ ์์ฑ์ ๋ด๋ถ์์ ์ ๋๋ค.
- ํ์ ํ์ ์ ํ๋กํ ํ์ ์ ์์ ํ์ ๊ฐ์ฒด์ ์ธ์คํด์ค ํ๋กํผํฐ๋ฅผ ๋ชจ๋ ์์ํ๋๋ฐ, ํ์ ํ์ ์์ฑ์๊ฐ ์คํ๋๋ ์๊ฐ ์ด๋ฅผ ๋ชจ๋ ๋ฎ์ด์ฐ๋ฏ๋ก ๋ณ ์๋ฏธ๊ฐ ์์ต๋๋ค.
// ์กฐํฉ ์์ ์์
function SuperType(name) {
this.name = name;
this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function() {
console.log(this.name);
};
function SubType(name, age) {
SuperType.call(this, name); // SuperType()์ ๋ ๋ฒ์งธ ํธ์ถ (1)
this.age = age;
}
SubType.prototpye = new SuperType(); //SuperType()์ ์ฒ์ ํธ์ถ
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function() {
alert(this.age);
};
- (1) ํ์ํ ๋ถ๋ถ์
SuperType
์์ฑ์๊ฐ ์คํ๋๋ ๋ถ๋ถ์ด๋ค. ์ด ์ฝ๋๊ฐ ์คํ๋๋ฉดSubTpye.prototype
์๋name
๊ณผcolors
๋ ๊ฐ์ง ํ๋กํผํฐ๊ฐ ๋จ์ต๋๋ค. ์ด ๋์SuperType
์ ์ธ์คํด์ค ํฌ๋กํผํฐ์์ง๋ง ์ด์ ๋SubType
์ ํ๋กํ ํ์ ์ ์กด์ฌํฉ๋๋ค.SubType
์์ฑ์๋ฅผ ํธ์ถํ๋ฉดSuperType
์์ฑ์ ์ญ์ ํธ์ถ๋๋ฉด์ ์ธ์คํด์ค ํ๋กํผํฐname
๊ณผcolor
๋ฅผ ์ ๊ฐ์ฒด์ ๋ง๋๋๋ฐ ์ด๋ค์ ํ๋กํ ํ์ ์ ์กด์ฌํ๋ ํ๋กํผํฐ๋ฅผ ๊ฐ๋ฆฝ๋๋ค. - ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์๋ ๊ธฐ๋ณธ์ ์ธ ์์ด๋์ด๋ ํ์ํ์ ์ ํ๋กํ ํ์ ์ ํ ๋นํ๊ธฐ ์ํด ์์ ํ์ ์ ์์ฑ์๋ฅผ ํธ์ถํ ํ์๋ ์์ต๋๋ค. ํ์ํ๊ฑด ์์ ํ์ ์ ํ๋กํ ํ์ ๋ฟ์ ๋๋ค. ๊ฐ๋จํ ๋งํด ๊ธฐ์ ์์์ ์จ์ ์์ ํ์ ์ ํ๋กํ ํ์ ์ผ๋ก๋ถํฐ ์์ํ ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ํ์ ํ์ ์ ํ๋กํ ํ์ ์ ํ ๋นํฉ๋๋ค. ๊ธฐ์ ์กฐํฉ ์์์ ๊ธฐ๋ณธ ํจํด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
function inheritPrototype(subType, superType) {
var prototype = object(superType.prototype); //create object
prototype.constructor = subType; //augment object
subType.prototype = prototype; //assign object
}
- ํจ์ ๋ด๋ถ์์ ์ผ์ด๋๋ ์ฒซ ๋จ๊ณ๋ ์์ ํ์ ์ ํ๋กํ ํ์ ์ ๋ณต์ ํ๋ ๊ฒ๋๋ค.
- ๋ค์์๋ constructor ํ๋กํผํฐ๋ฅผ prototype์ ํ ๋นํด์ ํ๋กํ ํ์ ์ ๋ฎ์ด์ธ ๋ ๊ธฐ๋ณธ constructor ํ๋กํผํฐ๊ฐ ์ฌ๋ผ์ง๋ ํ์์ ๋๋นํฉ๋๋ค.
- ๋ง์ง๋ง์ผ๋ก ํ์ ํ์ ์ ํ๋กํ ํ์ ์ ์๋ก ์์ฑํ ๊ฐ์ฒด๋ฅผ ํ ๋นํฉ๋๋ค.
function object(o) {
function F() {}
F.prototype = o;
return new F();
}
function inheritPrototype(subType, superType) {
var prototype = object(superType.prototype); //create object
prototype.constructor = subType; //augment object
subType.prototype = prototype; //assign object
}
function SuperType(name) {
this.name = name;
this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function() {
console.log(this.name);
};
function SubType(name, age) {
SuperType.call(this, name);
this.age = age;
}
inheritPrototype(SubType, SuperType);
SubType.prototype.sayAge = function() {
console.log(this.age);
};
var instance1 = new SubType("Nicholas", 29);
instance1.colors.push("black");
console.log(instance1.colors); //"red,blue,green,black"
instance1.sayName(); //"Nicholas";
instance1.sayAge(); //29
var instance2 = new SubType("Greg", 27);
console.log(instance2.colors); //"red,blue,green"
instance2.sayName(); //"Greg";
instance2.sayAge(); //27
- ํด๋น ์ฐธ์กฐ ํ์
์ ์ธ์คํด์ค๊ฐ ๊ฐ์ ธ์ผํ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ๋ด๊ณ ์๋ ๊ฐ์ฒด
SuperType.prototype
๋ฅผ ๊ฐ์ง๊ณ ๊ฐ์ฒด๋ฅผ ์๋กญ๊ฒ ํ๋ ๋ง๋ค์ด์subType.prototype
์ ํ ๋นํฉ๋๋ค. - ์ธ์คํด์ค ํ๋กํ ํ์
์๋
SuperType.prototype
์ ๋ฃ์ด์ ๊ฒฐ๊ตญsubType.prototype
์ดSuperType.prototype
์ ๊ฐ๋ฆฌํค๊ฒ ๋ง๋๋ ๊ธฐ๋ฒ์ ๋๋ค. - ์ด ์์ ๋
SuperType
์์ฑ์๋ฅผ ๋จ ํ ๋ฒ๋ง ํธ์ถํ๋ฏ๋กSubType.prototype
์ ๋ถํ์ํ๊ณ ์ฌ์ฉํ์ง ์๋ ํ๋กํผํฐ๋ฅผ ๋ง๋ค์ง ์๋์ ์์ ํจ๊ณผ์ ์ ๋๋ค. ๊ธฐ์ ์กฐํฉ ์์์ ์ฐธ์กฐ ํ์ ์์ ๊ฐ์ฅ ํจ์จ์ ์ธ ์์ ํจ๋ฌ๋ค์์ผ๋ก ํ๊ฐ ๋ฐ์ต๋๋ค. - ํ๋กํ ํ์
์ฒด์ธ์ด ์จ์ ํ ์ ์ง๋๋ฏ๋ก
instanceof
์isPrototypeOf()
๋ฉ์๋๋ ์ ์ ์๋ํฉ๋๋ค.