// 1. κ°μ²΄ 리ν°λ΄λ‘ μμ±νλ λ²
var card = {suit: "ννΈ", rank: "A"}
// 2. μμ±μλ‘ μμ±νλ λ²
function Card(Suit,rank) {
this.suit = suit;
this.rank = rank;
}
var card = new Card("ννΈ","A");
// 3. Object.createλ‘ μμ±νλ λ°©λ²
var card = Object.create(Object.prototype,{
suit: {
value: "ννΈ",
writable: true,
enumerable: true,
configurable: true
},
rank: {
value: "A",
writable: true,
enumerable: true,
configurable: true
}
});
- μμ±μ μμμ this λ€μ λ©μλλ₯Ό μ μνλ©΄ κ·Έ μμ±μλ‘ μμ±ν λͺ¨λ μΈμ€ν΄μ€μ λκ°μ λ©μλκ° μΆκ° λλ€. κ·Έλμ λ©λͺ¨λ¦¬λ₯Ό λ§μ΄ μλΉνκ² λλ€.
function Circle(center,radius) {
this.center = center;
this.radius = radius;
this.area = function() {
return Math.PI*this.radius*this.radius;
};
}
var c1 = new Circle({x:0, y:0}, 2.0);
var c2 = new Circle({x:0, y:1}, 3.0);
var c3 = new Circle({x:1, y:0}, 1.0);
- κ°κ°μ μΈμ€ν΄μ€κ° λκ°μ λ©μλ areaλ₯Ό μμ νλ€.
- μλ°μ€ν¬λ¦½νΈμμλ ν¨μλ κ°μ²΄μ΄λ―λ‘ ν¨μ κ°μ²΄κ° κΈ°λ³Έμ μΌλ‘ prototype νλ‘νΌν°λ₯Ό κ°κ³ μλ€. (proto νλ‘νΌν°λμ λ€λ₯Έκ±°λ€!)
function F() {};
console.log(F.prototype) // Object {}
- prototype μμ±μ μμ μ prototype κ°μ²΄λ‘ μμ κ°μ²΄(μμ±μλ‘ μμ±ν μΈμ€ν΄μ€)κ° μ°Έμ‘°νλ κ°μ²΄μ΄λ€.
- νλ‘ν νμ κ°μ²΄μ νλ‘νΌν°λ μμ±μλ‘ μμ±ν λͺ¨λ μΈμ€ν΄μ€μμ κ·Έ μΈμ€ν΄μ€μ νλ‘νΌν°μ²λΌ μ¬μ© κ°λ₯νλ€.
F.protoype.prop = "prototype value";
var obj = new F();
console.log(obj.prop); // prototype value
// μΈμ€ν°μ€μ νλ‘νΌν°μ κ°μ λμ
νμ λ μ΄λ¦μ΄ κ°μ νλ‘νΌν°κ° μμΌλ©΄ κ·Έ νλ‘νΌν°μ κ°μ λμ
.
obj.prop = "instance value"; // κ·Έλ μ§ μμ κ²½μ° μΈμ€ν΄μ€μ κ·Έ μ΄λ¦μΌλ‘ νλ‘νΌν°λ₯Ό μΆκ°ν νμ κ°μ λμ
console.log(obj.prop); // instance value
console.log(F.prototype.prop); // prototype value
β μ΄λ κ² νλ‘ν νμ κ°μ²΄μ νλ‘νΌν°λ₯Ό μΈμ€ν°μ€μμ μ°Έμ‘°ν μ μλ μν©μ κ°λ¦¬μΌ 'μΈμ€ν΄μ€κ° νλ‘ν νμ κ°μ²΄λ₯Ό μμνκ³ μλ€' λΌκ³ νλ€.
π μμμ μκΈ°ν μμ±μ μμμ λ©μλλ₯Ό μ μνλ λ°©μμ λ¬Έμ μ μ ν΄κ²°νλ λ² (λ©λͺ¨λ¦¬ λλΉ νΌνλ λ²)
// Circle μμ±μ
function Circle(center,radius) {
this.center = center;
this.radius = radius;
}
// Circle μμ±μμμ prototype νλ‘νΌν°μ area λ©μλλ₯Ό μΆκ°
Circle.prototype.area = function() {
return Math.PI*this.radius*this.radius; // λ©μλ μμ thisλ μμ±μλ‘ μμ±ν μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν¨λ€.
};
// Circle μμ±μλ‘ μΈμ€ν΄μ€λ₯Ό μμ±
var c1 = new Circle({x:0, y:0}, 2.0);
var c2 = new Circle({x:0, y:1}, 3.0);
var c3 = new Circle({x:1, y:0}, 1.0);
console.log("λμ΄ = " + c1.area()); // λμ΄ = 12.566370614359172
- μμ μ½λμμ μΈμ€ν΄μ€ c1,c2,c3 μμλ area λ©μλκ° μ‘΄μ¬νμ§ μμ§λ§ νλ‘ν νμ μ μ μνκΈ° λλ¬Έμ area λ©μλλ₯Ό μ¬μ©ν μ μλ€.
- μ΄μ²λΌ μμ±μμ νλ‘ν νμ κ°μ²΄μ λ©μλλ₯Ό μΆκ°νλ©΄ μΈμ€ν΄μ€μ λ©μλλ₯Ό μΆκ°νμ§ μμλ μΈμ€ν΄μ€κ° νλ‘ν νμ κ°μ²΄μ λ©μλλ₯Ό μμ λ°μ μ¬μ© ν μ μμ΄ λ©λͺ¨λ¦¬ λλΉλ₯Ό νΌν μ μλ€.
- μλ°μ€ν¬λ¦½νΈμ μμμ νλ‘ν νμ 체μΈμ΄λΌκ³ λΆλ₯Έλ κ°μ²΄μ μλ£κ΅¬μ‘°λ‘ ꡬνλμ΄ μμΌλ©°, 'νλ‘ν νμ μμ'μ΄λΌκ³ λΆλ₯Έλ€.
- μμμ νλ μ΄μ : μμμ μ¬μ©νλ©΄ μ΄λ―Έ μ μλ νλ‘νΌν°μ λ©μλμ μ½λλ₯Ό μ¬μ¬μ©ν μ μκ³ μλ‘μ΄ κΈ°λ₯μ μΆκ°ν΄μ νμ₯λ κ°μ²΄λ₯Ό λ§λ€ μ μλ€. μ€λ³΅ μ½λλ₯Ό μμ±νμ§ μμλ λλ―λ‘ μ μ§ λ³΄μμ±μ΄ λμ νλ‘κ·Έλ¨μ λ§λ€ μ μλ€.
- λͺ¨λ κ°μ²΄λ λ΄λΆ νλ‘νΌν° [[Prototype]]μ κ°μ§κ³ μλ€. βοΈμ΄κ²μ ν¨μ κ°μ²΄μ prototype νλ‘νΌν°μλ λ€λ₯Έ κ°μ²΄λ€βοΈ
- ES5κΉμ§λ μ¬μ©μκ° λ΄λΆ νλ‘νΌν° [[Prototype]]μ μ½κ±°λ μΈ μ μμμ§λ§, ES6λΆν°λ proto νλ‘νΌν°μ [Prototype]]μ κ°μ΄ μ μ₯λλ€.
κ·Έλ¬λ―λ‘ μ΄ ν¬μ€ν μμλ [[Prototype]] λμ μ __proto__λ‘ νκΈ°νκ² λ€.
κ°μ²΄μ proto νλ‘νΌν°λ κ·Έ κ°μ²΄μκ² μμμ ν΄μ€, μ¦ μ μ μλ₯Ό λ¬Όλ €μ€ λΆλͺ¨ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
λ°λΌμ κ°μ²΄λ proto νλ‘νΌν°κ° κ°λ¦¬ν€λ λΆλͺ¨ κ°μ²΄μ νλ‘νΌν°λ₯Ό λ¬Όλ € λ°μμ μ¬μ©ν μ μλ€.
μλ°μ€ν¬λ¦½νΈλ νΉμ κ°μ²΄μ νλ‘νΌν°λ λ©μλμ μ κ·Όνλ €κ³ ν λ ν΄λΉ κ°μ²΄μ μ κ·Όνλ €λ νλ‘νΌν° λλ λ©μλκ° μλ€λ©΄ [[Prototype]]μ΄ κ°λ¦¬ν€λ λ§ν¬λ₯Ό λ°λΌ μμ μ λΆλͺ¨ μν μ νλ νλ‘ν νμ κ°μ²΄μ νλ‘νΌν°λ λ©μλλ₯Ό μ°¨λ‘λλ‘ κ²μνλ€. μ΄κ²μ 'νλ‘ν νμ 체μΈ'μ΄λΌ νλ€.
var objA = {
name: "Tom",
sayHello: function() { console.log("Hello! " + this.name); }
};
var objB = {
name : "Huck"
};
objB.__proto__ = objA;
var objC = {};
objC.__proto__ = objB;
objC.sayHello(); // "Hello! Huck"
μμ μ½λμ λ±μ₯ν κ°μ²΄ μΈ κ°λ proto νλ‘νΌν°λ₯Ό μ¬μ©ν μ°κ²°κ³ λ¦¬λ‘ λ¬Άμ¬ μμμ μ μ μλ€.
μ§κΈκΉμ§ νλ‘ν νμ μμμ κ΄ν΄ μ€λͺ νμ§λ§ μ€μ λ‘ νλ‘κ·Έλλ°μ ν λλ proto νλ‘νΌν° κ°μ μ§μ μ λ ₯ν΄μ μμνμ§ μλλ€!
μΌλ°μ μΌλ‘ λ€μκ³Ό κ°μ λ°©λ²μΌλ‘ μμνλ€.
- μμ±μλ‘ κ°μ²΄λ₯Ό μμ±ν λ μμ±μμ prototype νλ‘νΌν°μ μΆκ°νλ λ°©λ²
- Object.create λ©μλλ‘ μμμ λ°μ νλ‘ν νμ μ μ§μ νμ¬ κ°μ²΄λ₯Ό μμ±νλ λ°©λ²
- κ°μ²΄μ νλ‘ν νμ μ Object.getPrototypeOf λ©μλλ‘ κ°μ Έμ¬ μ μλ€. (λ¬Όλ‘ μ§μνλ μΉλΈλΌμ°μ μμλ obj.__proto__λ‘λ νλ‘ν νμ μ κ°μ Έμ¬ μ μλ€.)
function F() {}
var obj = new F();
console.log(Object.getPrototypeOf(obj)); // Object {}
- μ μ¬ν κ°μ²΄ μ¬λ¬ κ°λ₯Ό μ½κ² λ§λ€ λ new μ°μ°μμ μμ±μ ν¨μλ₯Ό μ¬μ©νλ€.
- μμ±μ ν¨μ(constructor function)μ μΌλ° ν¨μμ κΈ°μ μ μΈ μ°¨μ΄λ μμ΅λλ€. λ€λ§ μμ±μ ν¨μλ μλ λ 'κ΄λ‘'λ₯Ό λ°λ₯Έλ€.
- ν¨μ μ΄λ¦μ 첫 κΈμλ λλ¬Έμλ‘ μμ
- λ°λμ 'new' μ°μ°μλ₯Ό λΆμ¬ μ€ν
μ κΉ! λͺ¨λ ν¨μλ μμ±μ ν¨μκ° λ μ μλ€λ μ μ μμ§ λ§μ. newλ₯Ό λΆμ¬ μ€ννλ€λ©΄ μ΄λ€ ν¨μλΌλ μμ κ°μ΄ μκ³ λ¦¬μ¦μ΄ μλλλ€. μ΄λ¦μ '첫κΈμκ° λλ¬ΈμμΈ' μμ±μ ν¨μλ newλ₯Ό λΆμ¬ μ€ννλ€λ κ²μ 곡λμ μ½μ, κ΄λ‘μΌ λΏμ΄λ€.
function User(name) {
this.name = name; // thisλ λ°λ‘ μμ±μ ν¨μ μμ μ κ°λ¦¬ν¨λ€. μ΄λ κ² thisμ μ μ₯λ κ²λ€μ newλ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό λ§λ€ λ κ·Έ κ°μ²΄μ μ μ©λλ€.
this.isAdmin = false;
}
let user = new User("보λΌ");
alert(user.name); // 보λΌ
alert(user.isAdmin); // false
β μμ±μλ₯Ό new μ°μ°μλ‘ νΈμΆν΄μ μΈμ€ν΄μ€λ₯Ό μμ±νλ©΄ λ΄λΆμ μΌλ‘ μ΄λ€ μμ μ ν κΉ?
μμ μ½λ new User(...)λ₯Ό μ¨μ ν¨μλ₯Ό μ€ννλ©΄ μλμ κ°μ΄ μκ³ λ¦¬μ¦μ΄ μλνλ€.
- λΉ κ°μ²΄λ₯Ό λ§λ€μ΄ thisμ ν λΉνλ€.
- μμ±μμ prototype νλ‘νΌν° κ°μ μμ±λ κ°μ²΄μ proto νλ‘νΌν° κ°μΌλ‘ λμ . (μ΄ λ, μμ±μμ prototype νλ‘νΌν° κ°μ΄ κ°μ²΄κ° μλλ©΄ Obejct.prototypeμ νλ‘ν νμ μΌλ‘ μ€μ )
- ν¨μ λ³Έλ¬Έμ μ€ννλ€. thisμ μλ‘μ΄ νλ‘νΌν°λ₯Ό μΆκ°ν΄ thisλ₯Ό μμ νλ€.(κ°μ²΄μ μ΄κΈ°ν)
- thisλ₯Ό λ°ννλ€.
function User(name) {
// this = {}; (λΉ κ°μ²΄κ° μμμ μΌλ‘ λ§λ€μ΄μ§κ³ )
// this.__proto__ = User.prototype (μμ±μμ prototype νλ‘νΌν°λ₯Ό μμ±λ κ°μ²΄μ νλ‘ν νμ
μΌλ‘ μ€μ )
// μλ‘μ΄ νλ‘νΌν°λ₯Ό thisμ μΆκ°ν¨ (κ°μ²΄μ μ΄κΈ°ν)
this.name = name;
this.isAdmin = false;
// return this; (thisκ° μμμ μΌλ‘ λ°νλ¨)
}