ìë°ì€í¬ëŠœížë ê°ì²Ž ì§í¥ì íë¡ê·žëë° ìžìŽìŽë©° ìë°ì€í¬ëŠœížë¥Œ ìŽë£šê³ ìë ê±°ì 몚ë ê²ìŽ ê°ì²Žë€.
ìë°ì€í¬ëŠœížë íë¡í íì êž°ë°ì ê°ì²Žì§í¥ íë¡ê·žëë° ìžìŽë€.
ê°ì²Žì§í¥ íë¡ê·žëë°ì ì€ìžê³ì ì€ì²Žë¥Œ ìžìíë ì² íì ì¬ê³ 륌 íë¡ê·žëë°ì ì 목íë €ë ìëìì ììëë€. ì€ì²Žë ì±ì§ì ëíëŽë ìì±(attribute/property)ì ê°ì§ê³ ìê³ , ë€ìí ìì± ì€ìì íë¡ê·žëšì íìí ìì±ë§ ê°ì¶ë € ëŽ íííë ê²ì ì¶ìí(abstraction)ëŒê³ íë€.
ìì±ì íµíŽ ì¬ë¬ ê°ì ê°ì íëì ëšìë¡ êµ¬ì±í ë³µí©ì ìž ìë£êµ¬ì¡°ë¥Œ ê°ì²ŽëŒ íë©°, ê°ì²Žì§í¥ íë¡ê·žëë°ì ë 늜ì ìž ê°ì²Žì ì§í©ìŒë¡ íë¡ê·žëšì íííë €ë íë¡ê·žëë° íšë¬ë€ììŽë€.
ê°ì²Žì§í¥ íë¡ê·žëë°ì ê°ì²Žì ìí륌 ëíëŽë ë°ìŽí°ì ìí ë°ìŽí°ë¥Œ ì¡°ìí ì ìë ëìì íëì ë
ŒëŠ¬ì ìž ëšìë¡ ë¬¶ìŽ ë³µí©ì ìž ìë£êµ¬ì¡°ë¡ ëíëžë€. ìŽ ë ê°ì²Žì ìí ë°ìŽí°ë¥Œ íë¡íŒí°, ëìì ë©ìëëŒ ë¶ë¥žë€.
ê°ì²Ž ì§í¥ íë¡ê·žëë° ë°©ìììë ììì íµíŽ ë¶íìí ì€ë³µì ë°©ì§íë€. ìë°ì€í¬ëŠœížë íë¡í íì ì êž°ë°ìŒë¡ ììì 구ííë€.
// ìì±ì íšì
function Circle(radius) {
this.radius = radius;
}
// Circle ìì±ì íšìê° ìì±í 몚ë ìžì€íŽì€ê° getArea ë©ìë륌
// ê³µì íŽì ì¬ì©í ì ìëë¡ íë¡í íì
ì ì¶ê°íë€.
// íë¡í íì
ì Circle ìì±ì íšìì prototype íë¡íŒí°ì ë°ìžë©ëìŽ ìë€.
Circle.prototype.getArea = function () {
return Math.PI * this.radius ** 2;
};
// ìžì€íŽì€ ìì±
const circle1 = new Circle(1);
const circle2 = new Circle(2);
// Circle ìì±ì íšìê° ìì±í 몚ë ìžì€íŽì€ë ë¶ëªš ê°ì²Žì ìí ì íë
// íë¡í íì
Circle.prototypeìŒë¡ë¶í° getArea ë©ìë륌 ììë°ëë€.
// ìŠ, Circle ìì±ì íšìê° ìì±íë 몚ë ìžì€íŽì€ë íëì getArea ë©ìë륌 ê³µì íë€.
console.log(circle1.getArea === circle2.getArea); // true
console.log(circle1.getArea()); // 3.141592653589793
console.log(circle2.getArea()); // 12.566370614359172
íë¡í íì ì ìŽë€ ê°ì²Žì ìì(ë¶ëªš) ê°ì²Žì ìí ì íë ê°ì²Žë¡ì ë€ë¥ž ê°ì²Žì ê³µì íë¡íŒí°(ë©ìë í¬íš)ì ì ê³µíë€. íë¡í íì ì ììë°ì íì(ìì) ê°ì²Žë ìì ê°ì²Žì íë¡íŒí°ë¥Œ ìì ì íë¡íŒí°ì²ëŒ ìì ë¡ê² ì¬ì©í ì ìë€.
몚ë ê°ì²Žë [[Prototype]] ìŽëŒë ëŽë¶ ì¬ë¡¯ì ê°ì§ë©°, ìŽ ëŽë¶ ì¬ë¡¯ì ê°ì íë¡í íì (nullìž ê²œì°ë ìë€.) [[Prototype]]ì ì ì¥ëë íë¡í íì ì ê°ì²Ž ìì± ë°©ìì ìíŽ ê²°ì ëë€. ìŠ, ê°ì²Žê° ìì±ë ë ê°ì²Ž ìì± ë°©ìì ë°ëŒ íë¡í íì ìŽ ê²°ì ëê³ [[Prototype]] ì ì ì¥ëë€.
몚ë ê°ì²Žë íëì íë¡í íì ì ê°ëë€. ê·žëŠ¬ê³ ëªšë íë¡í íì ì ìì±ì íšìì ì°ê²°ëìŽ ìë€.
[[Prototype]] ëŽë¶ ì¬ë¡¯ìë ì§ì ì ê·Œí ì ìì§ë§, ì 귞늌ì²ëŒ proto ì ê·Œì íë¡íŒí°ë¥Œ íµíŽ ìì ì íë¡í íì , ìŠ ìì ì [[Prototype]] ëŽë¶ ì¬ë¡¯ìŽ ê°ëŠ¬í€ë íë¡í íì ì ê°ì ì ìŒë¡ ì ê·Œí ì ìë€.
몚ë ê°ì²Žëproto ì ê·Œì íë¡íŒí°ë¥Œ íµíŽ ìì ì íë¡í íì , ìŠ [[Prototype]] ëŽë¶ ì¬ë¡¯ì ê°ì ì ìŒë¡ ì ê·Œí ì ìë€.
const person = { name: 'Lee' };
// person ê°ì²Žë __proto__ íë¡íŒí°ë¥Œ ìì íì§ ìëë€.
console.log(person.hasOwnProperty('__proto__')); // false
// __proto__ íë¡íŒí°ë 몚ë ê°ì²Žì íë¡í íì
ê°ì²Žìž Object.prototypeì ì ê·Œì íë¡íŒí°ë€.
console.log(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__'));
// {get: Æ, set: Æ, enumerable: false, configurable: true}
// 몚ë ê°ì²Žë Object.prototypeì ì ê·Œì íë¡íŒí° __proto__륌 ììë°ì ì¬ì©í ì ìë€.
console.log({}.__proto__ === Object.prototype); // true
proto ì ê·Œì íë¡íŒí°ë¥Œ íµíŽ íë¡í íì
ì ì ê·Œíë ê²ì ê¶ì¥íì§ ìêž° ë묞ì, íë¡íŒí° ëì íë¡í íì
ì 찞조륌 ì·šëíê³ ì¶ì 겜ì°ìë Object.getPrototpyeOf
ë©ìëë Object.setPrototypeOf
ë©ìë륌 ì¬ì©í ê²ì ê¶ì¥íë€.
// 1. 1ë² ìœë
const parent = {};
const child = {};
// childì íë¡í íì
ì parentë¡ ì€ì
child.__proto__ = parent;
// parentì íë¡í íì
ì childë¡ ì€ì
parent.__proto__ = child; // TypeError: Cyclic __proto__ value
// 2. 2ë² ìœë ì¬ì© ê¶ì¥
const obj = {};
const parent = { x: 1 };
// obj ê°ì²Žì íë¡í íì
ì ì·šë
Object.getPrototypeOf(obj); // obj.__proto__;
// obj ê°ì²Žì íë¡í íì
ì êµì²Ž
Object.setPrototypeOf(obj, parent); // obj.__proto__ = parent;
console.log(obj.x); // 1
íšì ê°ì²Žë§ìŽ ìì íë prototype íë¡íŒí°ë ìì±ì íšìê° ìì±í ìžì€íŽì€ì íë¡í íì ì ê°ëŠ¬íšë€. prototype íë¡íŒí°ë ìì±ì íšìê° ìì±í ê°ì²Ž(ìžì€íŽì€)ì íë¡í íì ì ê°ëŠ¬íšë€. ë°ëŒì ìì±ì íšìë¡ì ížì¶í ì ìë íšì, ìŠ non-constructorìž íìŽí íšìì ES6 ë©ìë ì¶ìœííìŒë¡ ì ìí ë©ìëë prototype íë¡íŒí°ë¥Œ ìì íì§ ììŒë©° íë¡í íì ë ìì±íì§ ìëë€.
몚ë ê°ì²Žê° ê°ì§ê³ ìë proto ì ê·Œì íë¡íŒí°ì íšì ê°ì²Žë§ìŽ ê°ì§ê³ ìë prototype íë¡íŒí°ë ê²°êµ ëìŒí íë¡í íì ì ê°ëŠ¬íšë€.
ìì±ì íšìì prototype íë¡íŒí°ì ìì±ì íšìë¡ ì°ìŽëž ê°ì²Žì proto ì ê·Œì íë¡íŒí°ë ëìŒí íë¡í íì ì ê°ëŠ¬íšë€.
몚ë íë¡í íì ì constructor íë¡íŒí°ë¥Œ ê°ëë€. ìŽ constructor íë¡íŒí°ë prototype íë¡íŒí°ë¡ ìì ì ì°žì¡°íê³ ìë ìì±ì íšì륌 ê°ëŠ¬íšë€. ìŽ ì°ê²°ì ìì±ì íšìê° ìì±ë ë, ìŠ íšì ê°ì²Žê° ìì±ë ë ìŽë€ì§ë€.
ìì±ì íšìì ìíŽ ìì±ë ìžì€íŽì€ë íë¡í íì ì constructor íë¡íŒí°ì ìíŽ ìì±ì íšìì ì°ê²°ëë€. 늬í°ëŽ íêž°ë²ì ìíŽ ìì±ë ê°ì²Žë ì¶ì ì°ì°(OrdinaryObjectCreate)륌 ížì¶íì¬ ë¹ ê°ì²Žë¥Œ ìì±íê³ íë¡íŒí°ë¥Œ ì¶ê°íë€.
늬í°ëŽ íêž°ë²ì ìíŽ ìì±ë ê°ì²Žë ììì ìíŽ íë¡í íì ìŽ íìíë€. ë°ëŒì 늬í°ëŽ íêž°ë²ì ìíŽ ìì±ë ê°ì²Žë ê°ìì ìž ìì±ì íšì륌 ê°ëë€. íë¡í íì ì ìì±ì íšìì ëë¶ìŽ ìì±ëë©° prototype, constructor íë¡íŒí°ì ìíŽ ì°ê²°ëìŽ ìêž° ë묞ìŽë€. ë€ì ë§íŽ, íë¡í íì 곌 ìì±ì íšìë ëšë ìŒë¡ ì¡Žì¬í ì ìê³ ìžì ë ììŒë¡ ì¡Žì¬íë€.
ð§ ì¶ì ì°ì°
ì¶ì ì°ì°ì ECMAScript ì¬ììì ëŽë¶ ëìì 구í ìê³ ëŠ¬ìŠì ííí ê²ìŽë€. ECMAScript ì¬ììì ì€ëª ì ìíŽ ì¬ì©ëë íšìì ì ì¬í ìì¬ìœëëŒê³ ìŽíŽíì.
ê°ì²Žë 늬í°ëŽ íêž°ë² ëë ìì±ì íšìì ìíŽ ìì±ëë¯ë¡ ê²°êµ ëªšë ê°ì²Žë ìì±ì íšìì ì°ê²°ëìŽ ìë€. íë¡í íì ì ìì±ì íšìê° ìì±ëë ìì ì ëë¶ìŽ ìì±ëë€. íë¡í íì 곌 ìì±ì íšìë ëšë ìŒë¡ ì¡Žì¬í ì ìê³ ìžì ë ììŒë¡ ì¡Žì¬íêž° ë묞ìŽë€.
ìì±ì íšìë¡ì ížì¶í ì ìë íšì, ìŠ constructor(íšì ì ìžë¬ž, íšì ííì, íŽëì€)ë íšì ì ìê° íê°ëìŽ íšì ê°ì²Žë¥Œ ìì±íë ìì ì íë¡í íì ë ëë¶ìŽ ìì±ëë€.
ìì±ë íë¡í íì ì ì€ì§ constructor íë¡íŒí°ë§ì ê°ë ê°ì²Žë€. íë¡í íì ë ê°ì²ŽìŽê³ 몚ë ê°ì²Žë íë¡í íì ì ê°ì§ë¯ë¡ íë¡í íì ë ìì ì íë¡í íì ì ê°ëë€. ìì±ë íë¡í íì ì íë¡í íì ì Object.prototypeìŽë€.
ë¹ížìž ìì±ì íšìë ìŒë° íšìì ë§ì°¬ê°ì§ë¡ ë¹ížìž ìì±ì íšìê° ìì±ëë ìì ì íë¡í íì ìŽ ìì±ëë€.
ê°ì²Žê° ìì±ëêž° ìŽì ì ìì±ì íšìì íë¡í íì
ì ìŽë¯ž ê°ì²Ží ëìŽ ì¡Žì¬íë€. ìŽí ìì±ì íšì ëë 늬í°ëŽ íêž°ë²ìŒë¡ ê°ì²Žë¥Œ ìì±íë©Ž íë¡í íì
ì ìì±ë ê°ì²Žì [[Prototype]] ëŽë¶ ì¬ë¡¯ì í ë¹ëë€.
ê°ì²Žë ë€ì곌 ê°ìŽ ë€ìí ìì±ë°©ë²ìŽ ìë€.
ìŽì²ëŒ ë€ìí ë°©ììŒë¡ ìì±ë 몚ë ê°ì²Žë ê° ë°©ìë§ë€ ìžë¶ì ìž ê°ì²Ž ìì± ë°©ìì ì°šìŽë ììŒë ì¶ìì°ì° OrdinaryObjectCreate ì ìíŽ ìì±ëë€ë ê³µíµì ìŽ ìë€.
ì¶ì ì°ì° OrdinaryObjectCreateë íìì ìŒë¡ ìì ìŽ ìì±í ê°ì²Žì íë¡í íì ì ìžìë¡ ì ë¬ ë°ëë€. ê·žëŠ¬ê³ ìì ìŽ ìì±í ê°ì²Žì ì¶ê°í íë¡íŒí° 목ë¡ì ìµì ìŒë¡ ì ë¬í ì ìë€. ì¶ì ì°ì° OrdinaryObjectCrearteë ë¹ ê°ì²Žë¥Œ ìì±í í, ê°ì²Žì ì¶ê°í íë¡íŒí° 목ë¡ìŽ ìžìë¡ ì ë¬ë ê²œì° íë¡íŒí°ë¥Œ ê°ì²Žì ì¶ê°íë€. ê·žëŠ¬ê³ ìžìë¡ ì ë¬ë°ì íë¡í íì ì ìì ìŽ ìì±í ê°ì²Žì [[Prototype]] ëŽë¶ ì¬ë¡¯ì í ë¹í ë€ì, ìì±í ê°ì²Žë¥Œ ë°ííë€.
ìŠ íë¡í íì ì ì¶ì ì°ì° OrdinaryObjectCreateì ì ë¬ëë ìžìì ìíŽ ê²°ì ëë€. ìŽ ìžìë ê°ì²Žê° ìì±ëë ìì ì ê°ì²Ž ìì± ë°©ìì ìíŽ ê²°ì ëë€.
ê°ì²Ž 늬í°ëŽì íê°íì¬ ê°ì²Žë¥Œ ìì±í ë ì¶ìì°ì° OrdinaryObjectCreate ì ì ë¬ëë íë¡í íì ì Object.prototypeìŽë€. ê°ì²Ž 늬í°ëŽì ìíŽ ìì±ë ê°ì²Žë Object.prototypeì íë¡í íì ìŒë¡ ê°ê² ëë©° ììë°ëë€.
const obj = { x : 1 };
Object ìì±ì íšì륌 ì¬ì©íŽ ê°ì²Žë¥Œ ìì±í ë ì¶ìì°ì° OrdinaryObjectCreateì ì ë¬ëë íë¡í íì ì Object.prototypeìŽë€. ê°ì²Ž 늬í°ëŽê³Œ Object ìì±ì íšìì ìí ê°ì²Ž ìì± ë°©ìì ì°šìŽë íë¡íŒí°ë¥Œ ì¶ê°íë ë°©ìì ìë€. ê°ì²Ž 늬í°ëŽ ë°©ìì ê°ì²Ž 늬í°ëŽ ëŽë¶ì íë¡íŒí°ë¥Œ ì¶ê°íì§ë§ Object ìì±ì íšì ë°©ìì ìŒëš ë¹ ê°ì²Žë¥Œ ìì±í ìŽí íë¡íŒí°ë¥Œ ì¶ê°íŽìŒ íë€.
const obj = new Object();
obj.x = 1;
new ì°ì°ìì íšê» ìì±ì íšì륌 **ì¬ì©íŽ ìžì€íŽì€ë¥Œ ìì±í ë ì¶ìì°ì° OrdinaryObjectCreateê° ížì¶ëë€. **ìŽ ë ì ë¬ëë íë¡í íì ì ìì±ì íšì
ì prototype íë¡íŒí°ì ë°ìžë© ëìŽìë ê°ì²ŽìŽë€. ìŠ, ìì±ì íšìì ìíŽ ìì±ëë ê°ì²Žì íë¡í íì ì ìì±ì íšìì prototype íë¡íŒí°ì ë°ìžë©ëìŽ ìë ê°ì²ŽìŽë€. ì¬ì©ì ì ì ìì±ì íšì Person곌 ëë¶ìŽ ìì±ë íë¡í íì Person.prototypeì íë¡íŒí°ë constructorë¿ìŽë€.
function Person(name) {
this.name = name;
}
const me = new Person('Lee');
function Person(name) {
this.name = name;
}
// íë¡í íì
ë©ìë
Person.prototype.sayHello = function () {
console.log(`Hi! My name is ${this.name}`);
};
const me = new Person('Lee');
const you = new Person('Kim');
me.sayHello(); // Hi! My name is Lee
you.sayHello(); // Hi! My name is Kim
function Person(name) {
this.name = name;
}
// íë¡í íì
ë©ìë
Person.prototype.sayHello = function () {
console.log(`Hi! My name is ${this.name}`);
};
const me = new Person('Lee');
// hasOwnPropertyë Object.prototypeì ë©ìëë€.
console.log(me.hasOwnProperty('name')); // true
Person ìì±ì íšìì ìíŽ ìì±ë me ê°ì²Žë Object.prototypeì ë©ìëìž hasOwnProperty륌 ížì¶í ì ìë€. ìŽê²ì me ê°ì²Žê° Person.prototypeë¿ë§ ìëëŒ Object.prototypeë ììë°ìë€ëê²ì ì믞íë€.
Person.prototypeì íë¡í íì ì Object.prototypeìŽë€. íë¡í íì ì íë¡í íì ì ìžì ë Object.prototypeìŽë€.
ìë°ì€í¬ëŠœížë ê°ì²Žì íë¡íŒí°(ë©ìë í¬íš)ì ì ê·Œíë €ê³ í ë íŽë¹ ê°ì²Žì ì ê·Œíë €ë íë¡íŒí°ê° ìë€ë©Ž [[Prototype]] ëŽë¶ ì¬ë¡¯ì 찞조륌 ë°ëŒ ìì ì ë¶ëªšìí ì íë íë¡í íì ì íë¡íŒí°ë¥Œ ìì°šì ìŒë¡ ê²ìíë€. ìŽë¥Œ íë¡í íì 첎ìžìŽëŒê³ íë€.
íë¡í íì 첎ìžì ìµììì ìì¹íë ê°ì²Žë ìžì ë Object.prototypeìŽë€. ë°ëŒì 몚ë ê°ì²Žë Object.prototypeì ììë°ëë€. Object.prototypeì íë¡í íì ìŠ, [[Prototype]] ëŽë¶ì¬ë¡¯ì ê°ì nullìŽë€.
íë¡íŒí°ê° ìë ìë³ìë ì€ìœí 첎ìžìì ê²ìíë€. ìë°ì€í¬ëŠœíž ìì§ì íšìì ì€ì²©êŽê³ë¡ ìŽë£šìŽì§ ì€ìœíì ê³ìžµì 구조ìì ìë³ì륌 ê²ìíë€. ë°ëŒì ì€ìœí 첎ìžì ìë³ì ê²ìì ìí ë©ì»€ëìŠìŽëŒê³ í ì ìë€.
ì€ìœí 첎ìžê³Œ íë¡í íì 첎ìžì ìë¡ ì°êŽììŽ ë³ëë¡ ëìíë ê²ìŽ ìëëŒ ìë¡ íë ¥íì¬ ìë³ìì íë¡íŒí°ë¥Œ ê²ìíë ë° ì¬ì©ëë€.
ð§ call ë©ìë
call ë©ìëë thisë¡ ì¬ì©í ê°ì²Žë¥Œ ì ë¬íë©Žì íšì륌 ížì¶íë€.
const Person = (function () {
// ìì±ì íšì
function Person(name) {
this.name = name;
}
// íë¡í íì
ë©ìë
Person.prototype.sayHello = function () {
console.log(`Hi! My name is ${this.name}`);
};
// ìì±ì íšì륌 ë°í
return Person;
}());
const me = new Person('Lee');
// ìžì€íŽì€ ë©ìë
me.sayHello = function () {
console.log(`Hey! My name is ${this.name}`);
};
// ìžì€íŽì€ ë©ìëê° ížì¶ëë€. íë¡í íì
ë©ìëë ìžì€íŽì€ ë©ìëì ìíŽ ê°ë €ì§ë€.
me.sayHello(); // Hey! My name is Lee
íë¡í íì ìŽ ìì í íë¡íŒí°ë¥Œ íë¡í íì íë¡íŒí°, ìžì€íŽì€ê° ìì í íë¡íŒí°ë¥Œ ìžì€íŽì€ íë¡íŒí°ëŒê³ ë¶ë¥žë€.
íë¡í íì íë¡íŒí°ì ê°ì ìŽëŠì íë¡íŒí°ë¥Œ ìžì€íŽì€ì ì¶ê°íë©Ž íë¡í íì 첎ìžì ë°ëŒ íë¡í íì íë¡íŒí°ë¥Œ ê²ìíì¬ íë¡í íì íë¡íŒí°ë¥Œ ë®ìŽì°ë ê²ìŽ ìëëŒ ìžì€íŽì€ íë¡íŒí°ë¡ ì¶ê°íë€. ìŽì²ëŒ ìì êŽê³ì ìíŽ íë¡íŒí°ê° ê°ë €ì§ë íìì íë¡íŒí° ìëììŽëŒ íë€.
íì ê°ì²Žë¥Œ íµíŽ íí í íì ì íë¡íŒí°ë¥Œ ë³ê²œ ëë ìì íë ê²ì ë¶ê°ë¥íë€. ë€ì ë§íŽ íì ê°ì²Žë¥Œ íµíŽ íë¡í íì ì get ììžì€ë íì©ëë set ììžì€ë íì©ëì§ ìëë€.
ð§ ì€ë²ëŒìŽë©(overriding)
ìì íŽëì€ê° ê°ì§ê³ ìë ë©ìë륌 íì íŽëì€ê° ì¬ì ìíì¬ ì¬ì©íë ë°©ì
ð§ ì€ë²ë¡ë©(overloading)
íšìì ìŽëŠì ëìŒíì§ë§ 맀ê°ë³ìì íì ëë ê°ìê° ë€ë¥ž ë©ìë륌 구ííê³ ë§€ê°ë³ìì ìíŽ ë©ìë륌 구ë³íì¬ ížì¶íë ë°©ì. ìë°ì€í¬ëŠœížë ì€ë²ë¡ë©ì ì§ìíì§ ìì§ë§ arguments ê°ì²Žë¥Œ ì¬ì©íì¬ êµ¬íí ìë ìë€.
íë¡í íì ì ëì ìŒë¡ ë³ê²œ ê°ë¥íë€. ìŽë¬í í¹ì§ì íì©íŽ ê°ì²Ž ê°ì ìì êŽê³ë¥Œ ëì ìŒë¡ ë³ê²œí ì ìë€. íë¡í íì ì ìì±ì íšì ëë ìžì€íŽì€ì ìíŽ êµì²Ží ì ìë€.
const Person = (function () {
function Person(name) {
this.name = name;
}
// â ìì±ì íšìì prototype íë¡íŒí°ë¥Œ íµíŽ íë¡í íì
ì êµì²Ž
Person.prototype = {
sayHello() {
console.log(`Hi! My name is ${this.name}`);
}
};
return Person;
}());
const me = new Person('Lee');
ìì ê°ìŽ íë¡í íì
ì êµì²Žíê² ëë©Ž **me
ì ìì±ì íšìë Person
ìŽ ìë Object
ë¡ ë°ëë€. ìŽì²ëŒ íë¡í íì
ì êµì²Žíê² ëë©Ž `constructoríë¡íŒí°ì ìì±ì íšìê°ì ì°ê²°ìŽ íꎎ**ëëë°,
constructoríë¡íŒí°ë¥Œ ì¶ê°íì¬ íë¡í íì
ì
constructor` íë¡íŒí°ë¥Œ ëìŽëŠŽ ì ìë€.
ìžì€íŽì€ì proto ì ê·Œì íë¡íŒí°ë¥Œ íµíŽ ì ê·Œí ì ìë€. ìì±ì íšìì prototype íë¡íŒí°ì ë€ë¥ž ììì ê°ì²Žë¥Œ ë°ìžë© íë ê²ì 믞ëì ìì±í ìžì€íŽì€ì íë¡í íì ì êµì²Žíë ê²ìŽë€.
function Person(name) {
this.name = name;
}
const me = new Person("Lee");
// íë¡í íì
ìŒë¡ êµì²Ží ê°ì²Ž
const parent = {
// constructor íë¡íŒí°ì ìì±ì íšì ê°ì ì°ê²°ì ì€ì
constructor: Person,
sayHello() {
console.log(`Hi! My name is ${this.name}`);
},
};
// ìì±ì íšìì prototype íë¡íŒí°ì íë¡í íì
ê°ì ì°ê²°ì ì€ì
Person.prototype = parent;
// me ê°ì²Žì íë¡í íì
ì parent ê°ì²Žë¡ êµì²Žíë€.
Object.setPrototypeOf(me, parent);
// ì ìœëë ìëì ìœëì ëìŒíê² ëìíë€.
// me.__proto__ = parent;
me.sayHello(); // Hi! My name is Lee
// constructor íë¡íŒí°ê° ìì±ì íšì륌 ê°ëŠ¬íšë€.
console.log(me.constructor === Person); // true
console.log(me.constructor === Object); // false
// ìì±ì íšìì prototype íë¡íŒí°ê° êµì²Žë íë¡í íì
ì ê°ëŠ¬íšë€.
console.log(Person.prototype === Object.getPrototypeOf(me)); // true
instanceof ì°ì°ìë ìŽí ì°ì°ìë¡ì ì¢ë³ì ê°ì²Žë¥Œ ê°ëŠ¬í€ë ìë³ì, ì°ë³ì ìì±ì íšì륌 ê°ëŠ¬í€ë ìë³ì륌 íŒì°ì°ìë¡ ë°ëë€. ë§ìœ ì°ë³ì íŒì°ì°ìê° íšìê° ìë ê²œì° Typeerrorê° ë°ìíë€.
ì°ë³ì ìì±ì íšìì prototypeì ë°ìžë©ë ê°ì²Žê° ì¢ë³ì ê°ì²Žì íë¡í íì ì²Žìž ìì ì¡Žì¬íë©Ž trueë¡ íê°ëê³ , ê·žë ì§ ìì 겜ì°ìë falseë¡ íê°ëë€.
instanceof ì°ì°ìë ìì±ì íšìì prototypeì ë°ìžë©ë ê°ì²Žê° íë¡í íì
ì²Žìž ìì ì¡Žì¬íëì§ íìžíë€.
Object.create ë©ìëë ëª ìì ìŒë¡ íë¡í íì ì ì§ì íì¬ ìë¡ìŽ ê°ì²Žë¥Œ ìì±íë€. ë€ë¥ž ê°ì²Žì ë§ì°¬ê°ì§ë¡ ì¶ì ì°ì° OrdinaryObjectCreate륌 ížì¶íë€.
Object.create ë©ìëì 첫 ë²ì§ž 맀ê°ë³ììë ìì±í ê°ì²Žì íë¡í íì ìŒë¡ ì§ì í ê°ì²Žë¥Œ ì ë¬íë€. ë ë²ì§ž 맀ê°ë³ììë ìì±í ê°ì²Žì íë¡íŒí° í€ì íë¡íŒí° ëì€í¬ëŠœí° ê°ì²Žë¡ ìŽë€ì§ ê°ì²Žë¥Œ ì ë¬íë€. ë ë²ì§ž ìžìë ìµì ìŽë¯ë¡ ìëµ ê°ë¥íë€.
// íë¡í íì
ìŽ nullìž ê°ì²Žë¥Œ ìì±íë€. ìì±ë ê°ì²Žë íë¡í íì
첎ìžì ì¢
ì ì ìì¹íë€.
// obj â null
let obj = Object.create(null);
console.log(Object.getPrototypeOf(obj) === null); // true
// Object.prototypeì ììë°ì§ 못íë€.
console.log(obj.toString()); // TypeError: obj.toString is not a function
// obj â Object.prototype â null
// obj = {};ì ëìŒíë€.
obj = Object.create(Object.prototype);
console.log(Object.getPrototypeOf(obj) === Object.prototype); // true
// obj â Object.prototype â null
// obj = { x: 1 };ì ëìŒíë€.
obj = Object.create(Object.prototype, {
x: { value: 1, writable: true, enumerable: true, configurable: true }
});
// ì ìœëë ë€ì곌 ëìŒíë€.
// obj = Object.create(Object.prototype);
// obj.x = 1;
console.log(obj.x); // 1
console.log(Object.getPrototypeOf(obj) === Object.prototype); // true
const myProto = { x: 10 };
// ììì ê°ì²Žë¥Œ ì§ì ììë°ëë€.
// obj â myProto â Object.prototype â null
obj = Object.create(myProto);
console.log(obj.x); // 10
console.log(Object.getPrototypeOf(obj) === myProto); // true
// ìì±ì íšì
function Person(name) {
this.name = name;
}
// obj â Person.prototype â Object.prototype â null
// obj = new Person('Lee')ì ëìŒíë€.
obj = Object.create(Person.prototype);
obj.name = 'Lee';
console.log(obj.name); // Lee
console.log(Object.getPrototypeOf(obj) === Person.prototype); // true
Object.create ë©ìëë 첫 ë²ì§ž 맀ê°ë³ìì ì ë¬ë ê°ì²Žì íë¡í íì 첎ìžì ìíë ê°ì²Žë¥Œ ìì±íë€. ìŽ ë©ìëì ì¥ì ì ë€ì곌 ê°ë€.
ES6ììë ê°ì²Ž 늬í°ëŽ ëŽë¶ìì proto ì ê·Œì íë¡íŒí°ë¥Œ ì¬ì©íì¬ ì§ì ììì 구íí ì ìë€.
const myProto = { x: 10 };
// ê°ì²Ž 늬í°ëŽì ìíŽ ê°ì²Žë¥Œ ìì±íë©Žì íë¡í íì
ì ì§ì íì¬ ì§ì ììë°ì ì ìë€.
const obj = {
y: 20,
// ê°ì²Žë¥Œ ì§ì ììë°ëë€.
// obj â myProto â Object.prototype â null
__proto__: myProto
};
/* ì ìœëë ìëì ëìŒíë€.
const obj = Object.create(myProto, {
y: { value: 20, writable: true, enumerable: true, configurable: true }
});
*/
console.log(obj.x, obj.y); // 10 20
console.log(Object.getPrototypeOf(obj) === myProto); // true
// ìì±ì íšì
function Person(name) {
this.name = name;
}
// íë¡í íì
ë©ìë
Person.prototype.sayHello = function () {
console.log(`Hi! My name is ${this.name}`);
};
// ì ì íë¡íŒí°
Person.staticProp = 'static prop';
// ì ì ë©ìë
Person.staticMethod = function () {
console.log('staticMethod');
};
const me = new Person('Lee');
// ìì±ì íšìì ì¶ê°í ì ì íë¡íŒí°/ë©ìëë ìì±ì íšìë¡ ì°žì¡°/ížì¶íë€.
Person.staticMethod(); // staticMethod
// ì ì íë¡íŒí°/ë©ìëë ìì±ì íšìê° ìì±í ìžì€íŽì€ë¡ ì°žì¡°/ížì¶í ì ìë€.
// ìžì€íŽì€ë¡ ì°žì¡°/ížì¶í ì ìë íë¡íŒí°/ë©ìëë íë¡í íì
ì²Žìž ìì ì¡Žì¬íŽìŒ íë€.
me.staticMethod(); // TypeError: me.staticMethod is not a function
in
ì°ì°ìin ì°ì°ìë ê°ì²Ž ëŽì í¹ì íë¡íŒí°ê° ì¡Žì¬íëì§ ì¬ë¶ë¥Œ íìžíë€. in ì°ì°ìë íë¡í íì ì²Žìž ìì ì¡Žì¬íë 몚ë íë¡í íì ìì íë¡íŒí°ë¥Œ ê²ìíë€.
const person = {
name: 'Lee',
address: 'Seoul'
};
// person ê°ì²Žì name íë¡íŒí°ê° ì¡Žì¬íë€.
console.log('name' in person); // true
// person ê°ì²Žì address íë¡íŒí°ê° ì¡Žì¬íë€.
console.log('address' in person); // true
// person ê°ì²Žì age íë¡íŒí°ê° ì¡Žì¬íì§ ìëë€.
console.log('age' in person); // false
Object.prototype.hasOwnProperty
ë©ìëObject.prototype.hasOwnProperty ë©ìë륌 ì¬ì©íŽë ê°ì²Žì í¹ì íë¡íŒí°ê° ì¡Žì¬íëì§ íìží ì ìë€. ìžìë¡ ì ë¬ë°ì íë¡íŒí° í€ê° ê°ì²Ž ê³ ì ì íë¡íŒí° í€ìž 겜ì°ìë§ true륌 ë°ííê³ ììë°ì íë¡í íì
ì íë¡íŒí°ìž ê²œì° false륌 ë°ííë€.
for ... in 묞ì ê°ì²Žì íë¡í íì ì²Žìž ìì ì¡Žì¬íë 몚ë íë¡í íì ì íë¡íŒí° ì€ìì íë¡íŒí° ìŽížëŠ¬ë·°íž [[Enumerable]]ì ê°ìŽ trueìž íë¡íŒí°ë¥Œ ìííë©° ìŽê±°íë€.
const person = {
name: 'Lee',
address: 'Seoul',
__proto__: { age: 20 }
};
for (const key in person) {
// ê°ì²Ž ìì ì íë¡íŒí°ìžì§ íìžíë€.
if (!person.hasOwnProperty(key)) continue;
console.log(key + ': ' + person[key]);
}
// name: Lee
// address: Seoul
Object.keysì Object.values ë©ìëë ê°ì²Ž ìì ì ìŽê±° ê°ë¥í íë¡íŒí° í€ì ê°ì ë°°ìŽë¡ ë°ííë€. ES8ìì ëì ë Object.entries ë©ìëë ê°ì²Ž ìì ì ìŽê±° ê°ë¥í í€ì ê°ì ìì ë°°ìŽì ë°°ìŽì ëŽì ë°ííë€.
const person = {
name: 'Lee',
address: 'Seoul',
__proto__: { age: 20 }
};
console.log(Object.keys(person)); // ["name", "address"]
console.log(Object.values(person)); // ["Lee", "Seoul"]
console.log(Object.entries(person)); // [["name", "Lee"], ["address", "Seoul"]]
Object.entries(person).forEach(([key, value]) => console.log(key, value));
/*
name Lee
address Seoul
*/
íêž°
ë묎 ìŽë €ìì ìžê³ ì¶ìë€