π Chapter 6: νλ‘ν νμ
- μλ°μ€ν¬λ¦½νΈλ νλ‘ν νμ κΈ°λ° μΈμ΄μ΄λ€.
- νλ‘ν νμ κΈ°λ° μΈμ΄μμλ μ΄λ€ κ°μ²΄λ₯Ό μν(prototype)μΌλ‘ μΌκ³ μ΄λ₯Ό 볡μ (μ°Έμ‘°)ν¨μΌλ‘μ¨ μμκ³Ό κ°μ ν¨κ³Όλ₯Ό μ»λλ€.
π νλ‘ν νμ μ κ°λ μ΄ν΄β
π constructor, prototype, instanceβ
var instance = new Constructor();
- μ΄λ€ μμ±μ ν¨μ(Constructor)λ₯Ό
new
μ°μ°μμ ν¨κ» νΈμΆνλ©΄ Constructor
μμ μ μλ λ΄μ©μ λ°νμΌλ‘ μλ‘μ΄ μΈμ€ν΄μ€κ° μμ±λλ€.- μ΄λ
instance
μλ__proto__
λΌλ νλ‘νΌν°κ° μλμΌλ‘ λΆμ¬λλλ°, - μ΄ νλ‘νΌν°λ
Constructor
μprototype
μ΄λΌλ νλ‘νΌν°λ₯Ό μ°Έμ‘°νλ€.
μ¬κΈ°μ prototype
μ κ°μ²΄μ΄λ€. μ΄λ₯Ό μ°Έμ‘°νλ __proto__
μμ λΉμ°ν κ°μ²΄μ΄λ€.
prototype
κ°μ²΄ λ΄λΆμλ μΈμ€ν΄μ€κ° μ¬μ©ν λ©μλλ₯Ό μ μ₯νλ€. κ·Έλ¬λ©΄ μΈμ€ν΄μ€μμλ μ¨κ²¨μ§ __proto__
λ₯Ό ν΅ν΄ μ΄ λ©μλλ€μ μ κ·Όν μ μκ² λλ€.
- λ€μ μμμ
Person
μ΄λΌλ μμ±μ ν¨μμprototype
μgetName
μ΄λΌλ λ©μλλ₯Ό μ§μ νλ€.
var Person = function (name) {
this._name = name;
};
Person.prototype.getName = function () {
return this._name;
}
var suzi = new Person('Suzi');
suzi.__proto__.getName(); // undefined
Person.prototype === suzi.__proto__ // true
- μ¬κΈ°μ
suzi.__proto__.getName();
νΈμΆνλ λΆλΆμ΄Suzi
λΌλ μ΄λ¦μ΄ μλλΌundefined
κ° λμ¨ μ΄μ λthis
μ λ°μΈλ©λ λμμ΄ μλͺ» μ§μ λμκΈ° λλ¬Έμ΄λ€. - μ΄λ€ ν¨μλ₯Ό λ©μλλ‘μ νΈμΆν λλ λ©μλλͺ
λ°λ‘ μμ κ°μ²΄κ° 곧
this
κ° λλ€. κ·Έλ κΈ° λλ¬Έμ νμ¬this
λsuzi.__proto__
λΌλ κ°μ²΄κ° λλ κ²μ΄λ€. μ΄ κ°μ²΄ λ΄λΆμλname
νλ‘νΌν°κ° μμΌλ―λ‘undefined
λ₯Ό λ°ννλ κ²μ΄λ€. - ν΄κ²°νλ λ°©λ²μΌλ‘λ
__proto__
μμ΄ μΈμ€ν΄μ€μμ 곧λ°λ‘ λ©μλλ₯Ό μ°λ©΄λλ€. μ΄λ¬ν μ΄μ λ__proto__
λ μλ΅ κ°λ₯ν νλ‘νΌν°μ΄κΈ° λλ¬Έμ΄λ€.
var suzi = new Person('Suzi');
suzi.getName(); // Suzi
μ¦,
new
μ°μ°μλ‘Constructor
λ₯Ό νΈμΆνλ©΄instance
κ° λ§λ€μ΄μ§λλ°, μ΄instance
μ μλ΅ κ°λ₯ν νλ‘νΌν°μΈ__proto__
λConstructor
μprototype
μ μ°Έμ‘°νλ€.
__proto__
νλ‘νΌν°λ μλ΅ κ°λ₯νλλ‘ κ΅¬νλΌ μκΈ° λλ¬Έμ μμ±μ ν¨μμprototype
μ μ΄λ€ λ©μλλ νλ‘νΌν°κ° μλ€λ©΄ μΈμ€ν΄μ€μμλ λ§μΉ μμ μ κ²μ²λΌ ν΄λΉ λ©μλλ νλ‘νΌν°μ μ κ·Όν μ μκ² λλ€.
π constructor νλ‘νΌν°β
- μμ±μ ν¨μμ νλ‘νΌν°μΈ
prototype
κ°μ²΄ λ΄λΆμλconstructor
λΌλ νλ‘νΌν°κ° μλ€. μΈμ€ν΄μ€μ__proto__
κ°μ²΄ λ΄λΆμλ λ§μ°¬κ°μ§μ΄λ€. - μ΄ νλ‘νΌν°λ λ¨μ΄ κ·Έλλ‘ μλμ μμ±μ ν¨μ(μκΈ° μμ )λ₯Ό μ°Έμ‘°νλ€. μΈμ€ν΄μ€λ‘λΆν° κ·Έ μνμ΄ λ¬΄μμΈμ§λ₯Ό μ μ μλ μλ¨μ΄λ€.
var arr = [1, 2];
Array.prototype.constructor === Array; // true
arr.__proto__.constructor === Array; // true
arr.constructor === Array; // true
var arr2 = new arr.constructor(3, 4);
console.log(arr2); // [3, 4];
constructor
λ₯Ό λ³κ²½νλλΌλ μ°Έμ‘°νλ λμμ΄ λ³κ²½λ λΏ μ΄λ―Έ λ§λ€μ΄μ§ μΈμ€ν΄μ€μ μνμ΄ λ°λλ€κ±°λ λ°μ΄ν° νμ μ΄ λ³νλ κ²μ μλλ€. μ΄λ€ μΈμ€ν΄μ€μ μμ±μ μ 보λ₯Ό μμλ΄κΈ° μν΄constructor
νλ‘νΌν°μ μμ‘΄νλ κ² νμ μμ νμ§ μλ€.- λ€μ κ° μ€μ λͺ¨λ λμΌν λμμ κ°λ¦¬ν€κ² λλ€
[Constructor]
[instance].__proto__.constructor
[instance].constructor
Object.getPrototypeOf([instance]).constructor
[Constructor].prototype.constructor
- λ€μ κ° μ€μ λͺ¨λ λμΌν κ°μ²΄(prototype)μ μ κ·Όν μ μλ€.
[Constructor].prototype
[instance].__proto__
[instance]
Object.getPrototypeOf([instance])
π νλ‘ν νμ 체μΈβ
π λ©μλ μ€λ²λΌμ΄λβ
- μΈμ€ν΄μ€κ° λμΌν μ΄λ¦μ νλ‘νΌν° λλ λ©μλλ₯Ό κ°μ§κ³ μλ€.
// λ©μλ μ€λ²λΌμ΄λ
var Person = function (name) {
this.name = name;
};
Person.prototype.getName = function () {
return this.name;
};
var iu = new Person('μ§κΈ');
iu.getName = function () {
return 'λ°λ‘ ' + this.name;
};
console.log(iu.getName()); // λ°λ‘ μ§κΈ
- μλ°μ€ν¬λ¦½νΈ μμ§μ΄
getName
μ΄λΌλ λ©μλλ₯Ό μ°Ύλ λ°©μμ κ°μ₯ κ°κΉμ΄ λμμΈ μμ μ νλ‘νΌν°λ₯Ό κ²μνκ³ , μμΌλ©΄ κ·Έλ€μμΌλ‘ κ°κΉμ΄ λμμΈ__proto__
λ₯Ό κ²μνλ μμλ‘ μ§νλλ€. - λ€μμ λ©μλ μ€λ²λΌμ΄λ©μ΄ μ΄λ€μ Έ μλ μν©μμ
prototype
μ μλ λ©μλμ μ κ·Όνλ λ°©λ²μ΄λ€. this
κ°prototype
μ λ°λΌλ³΄κ³ μλλ° μ΄κ±Έ μΈμ€ν΄μ€λ₯Ό λ°λΌλ³΄λλ‘call
μ΄λapply
λ‘ λ°κΏμ£Όλ©΄ λλ€.
console.log(iu.__proto__.getName()); // undefined
console.log(iu.__proto__.getName.call(iu)); // μ§κΈ
π νλ‘ν νμ 체μΈβ
- λ°°μ΄ λ¦¬ν°λ΄μ
__proto__
μλpop
,push
λ±μ μ΅μν λ°°μ΄ λ©μλ λ°constructor
κ° μλ€. - μΆκ°λ‘, μ΄
__proto__
μμ λλ€μ__proto__
κ° λ±μ₯νλλ°, μ΄μ λ λ°λ‘prototype
κ°μ²΄κ° κ°μ²΄μ΄κΈ° λλ¬Έμ΄λ€. κΈ°λ³Έμ μΌλ‘ λͺ¨λ κ°μ²΄μ__proto__
μλObject.prototype
μ΄ μ°κ²°λλ€.prototype
κ°μ²΄λ μμΈκ° μλλ€. - κ·Έλ κΈ° λλ¬Έμ λ°°μ΄μμ μλ΅ κ°λ₯ν
__proto__
λ₯Ό ν λ² λ λ°λΌκ°λ©΄Object.prototype
μ μ°Έμ‘°ν μ μλ€.
var arr = [1, 2];
arr(.__proto__).push(3);
arr(.__proto__.__proto__).hasOwnProperty(2); // true
- μ΄λ€ λ°μ΄ν°μ
__proto__
νλ‘νΌν° λ΄λΆμ λ€μ__proto__
νλ‘νΌν°κ° μ°μμ μΌλ‘ μ΄μ΄μ§ κ²μ νλ‘ν νμ 체μΈμ΄λΌ νκ³ , μ΄ μ²΄μΈμ λ°λΌκ°λ©° κ²μνλ κ²μ νλ‘ν νμ 체μ΄λμ΄λΌκ³ νλ€. - νλ‘ν νμ
체μΈλμ λ©μλ μ€λ²λΌμ΄λλ λμΌν λ§₯λ½μΈλ°, μ΄λ€ λ©μλλ₯Ό νΈμΆνλ©΄ μλ°μ€ν¬λ¦½νΈ μμ§μ λ°μ΄ν° μμ μ νλ‘νΌν°λ€μ κ²μν΄μ μνλ λ©μλκ° μμΌλ©΄ κ·Έ λ©μλλ₯Ό μ€ννκ³ , μμΌλ©΄
__proto__
λ₯Ό κ²μν΄μ μμΌλ©΄ κ·Έ λ©μλλ₯Ό μ€ννκ³ , μμΌλ©΄ λ€μ__proto__
λ₯Ό κ²μν΄μ μ€ννλ μμΌλ‘ μ§νλλ€.
// λ©μλ μ€λ²λΌμ΄λμ νλ‘ν νμ
체μ΄λ
var arr = [1, 2];
Array.prototype.toString.call(arr); // 1, 2
Object.prototype.toString.call(arr); // [object Array]
arr.toString(); // 1, 2
arr.toString = function () {
return this.join('-');
}
arr.toString(); // 1-2
π κ°μ²΄ μ μ© λ©μλμ μμΈμ¬νβ
- μ΄λ€ μμ±μ ν¨μμ΄λ
prototype
μ λ°λμ κ°μ²΄μ΄κΈ° λλ¬ΈμObject.prototype
μ΄ μΈμ λ νλ‘ν νμ 체μΈμ μ΅μλ¨μ μ‘΄μ¬νκΈ° λλ€. λ°λΌμ κ°μ²΄μμλ§ μ¬μ©ν λ©μλλ λ€λ₯Έ μ¬λ λ°μ΄ν° νμ μ²λΌ νλ‘ν νμ κ°μ²΄ μμ μ μν μκ° μλ€. κ·Έ μ΄μ λ λ€λ₯Έ λ°μ΄ν° νμ λ ν΄λΉ λ©μλλ₯Ό μ¬μ©ν μ μκ² λκΈ° λλ¬Έμ΄λ€.
// Object.prototypeμ μΆκ°ν λ©μλμμ μ κ·Ό
Object.prototype.getEntries = function () {
var res = [];
for (var prop in this) {
if (this.hasOwnProperty(prop)) {
res.push([prop, this[prop]]);
}
}
return res;
};
var data = [
['object', { a: 1, b: 2, c: 3 }], // [['a', 1], ['b', 2], ['c', 3]]
['number', 345], // []
['string', 'abc'], // [['0','a'], ['1', 'b'], ['2', 'c']]
['boolean', false], // []
['func', function () {}], // []
['array', [1, 2, 3]], // [['0', 1], ['1', 2], ['2', 3]]
];
data.forEach(function (datum) {
console.log(datum[1].getEntries());
});
- μμ κ°μ κ²½μ° λͺ¨λ λ°μ΄ν°κ° μ€λ₯ μμ΄ κ²°κ³Όλ₯Ό λ°ννκ³ μλ€. μλ μλλλ‘λΌλ©΄ κ°μ²΄κ° μλ λ€λ₯Έ λ°μ΄ν° νμ
μ λν΄μλ μ€λ₯λ₯Ό λμ§κ²λ λΌμΌ ν ν
λ°, μ΄λ λ°μ΄ν° νμ
μ΄κ±΄ 무쑰건 νλ‘ν νμ
체μ΄λμ ν΅ν΄
getEntries
λ©μλμ μ κ·Όν μ μμΌλ κ·Έλ κ² λμνμ§ μλ κ²μ΄λ€. - μ΄ κ°μ μ΄μ λ‘ κ°μ²΄λ§μ λμμΌλ‘ λμνλ κ°μ²΄ μ μ© λ©μλλ€μ λΆλμ΄
Object.prototype
μ΄ μλObject
μ€νν± λ©μλλ‘ λΆμ¬ν μλ°μ μμλ€. λν, μμ±μ ν¨μμΈObject
μ μΈμ€ν΄μ€μΈ κ°μ²΄ 리ν°λ΄ μ¬μ΄μλthis
λ₯Ό ν΅ν μ°κ²°μ΄ λΆκ°λ₯νκΈ° λλ¬Έμ μ¬λ μ μ© λ©μλμ²λΌ λ©μλλͺ μμ λμμ΄ κ³§this
κ° λλ λ°©μ λμthis
μ μ¬μ©μ ν¬κΈ°νκ³ λμ μΈμ€ν΄μ€λ₯Ό μΈμλ‘ μ§μ μ£Όμ ν΄μΌ νλ λ°©μμΌλ‘ ꡬνλΌ μλ€. - λ§μ½ κ°μ²΄ μ μ© λ©μλμ λν΄μλ λ€λ₯Έ λ°μ΄ν° νμ
κ³Ό λ§μ°¬κ°μ§μ κ·μΉμ μ μ©ν μ μμλ€λ©΄, μλ₯Ό λ€μ΄
Object.freeze()
μ²λΌ ννν μ μμμ κ²μ΄λ€. μ¦,instance.__proto__
μfreeze
λΌλ λ©μλκ° μμμ κ²μ΄λ€. - κ·Έλ¬ν μ΄μ λ‘ κ°μ²΄ νμ λ© μλλ€μ
Object.prototype
μ΄ μλObject
μ μ§μ λΆμ¬ν μλ°μ μμλ μ΄μ λObject.prototype
μ΄ μ¬νμ μ°Έμ‘°ν λ°μ΄ν°λΏ μλλΌ κΈ°λ³Έν λ°μ΄ν°μ‘°μ°¨__proto__
μ λ°λ³΅ μ κ·Όν¨μΌλ‘μ¨ λλ¬ν μ μλ μ΅μμ μ‘΄μ¬μ΄κΈ° λλ¬Έμ΄λ€. - λ°λλ‘ κ°μ μ΄μ μμ
Object.prototype
μλ μ΄λ€ λ°μ΄ν°μμλ νμ©ν μ μλ λ²μ©μ μΈ λ©μλλ€λ§ μλ€. (toString
,hasOwnProperty
,valueOf
,isPrototypeOf
)
π λ€μ€ νλ‘ν νμ 체μΈβ
- μλ°μ€ν¬λ¦½νΈ κΈ°λ³Έ λ΄μ₯ λ°μ΄ν° νμ
λ€μ λͺ¨λ νλ‘ν νμ
체μΈμ΄ 1λ¨κ³(κ°μ²΄)μ΄κ±°λ 2λ¨κ³λ‘ λλλ κ²½μ°λ§ μμμ§λ§ μ¬μ©μκ° μλ‘κ² λ§λλ κ²½μ°μλ κ·Έ μ΄μλ μΌλ§λ μ§ κ°λ₯νλ€. λκ°μ μ
__proto__
λ₯Ό μ°κ²°ν΄λκ°κΈ°λ§ νλ©΄ 무νλλ‘ μ²΄μΈ κ΄κ³λ₯Ό μ΄μ΄λκ° μ μλ€. - λκ°μ μ
__proto__
λ₯Ό μ°κ²°νλ λ°©λ²μ__proto__
κ° κ°λ¦¬ν€λ λμ, μ¦ μμ±μ ν¨μμprototype
μ΄ μ°κ²°νκ³ μ νλ μμ μμ±μ ν¨μμ μΈμ€ν΄μ€λ₯Ό λ°λΌλ³΄κ²λ ν΄μ£Όλ©΄ λλ€.
var Grade = function () {
var args = Array.prototype.slice.call(arguments);
for (var i = 0; i < args.length; i++) {
this[i] = args[i];
}
this.length = args.length;
};
var g = new Grade(100, 80);
- μ¬λ¬ κ°μ μΈμλ₯Ό λ°μ κ°κ° μμλλ‘ μΈν μ±ν΄μ μ μ₯νκ³ length νλ‘νΌν°κ° μ‘΄μ¬νλ λ±μΌλ‘
- λ°°μ΄μ ννλ₯Ό μ§λμ§λ§, λ°°μ΄μ λ©μλλ₯Ό μ¬μ©ν μ μλ μ μ¬λ°°μ΄κ°μ²΄μ΄λ€.
- μΈμ€ν΄μ€μμ λ°°μ΄ λ©μλλ₯Ό μ§μ μΈ μ μκ²λ νλ €λ©΄
g.__proto__
, μ¦Grade.prototype
μ΄ λ°°μ΄ μΈμ€ν΄μ€λ₯Ό λ°λΌλ³΄κ² νλ©΄ λλ€.
Grade.prototype = [];
- μ΄ λͺ λ Ήμ μν΄ μλ‘ λ³κ°λ‘ λΆλ¦¬λΌ μλ λ°μ΄ν°κ° μ°κ²°λμ΄ νλμ νλ‘ν νμ μ²΄μΈ ννλ₯Ό λ κ² λλ€.
- μ΄μ λ
Grade
μ μΈμ€ν΄μ€μΈg
μμ μ§μ λ°°μ΄μ λ©μλλ₯Ό μ¬μ©ν μ μλ€.
console.log(g); // Grade(2) [100, 80]
g.pop();
console.log(g); // Grade(1) [100]
g.push(90);
console.log(g); // Grade(2) [100, 90]
g
μΈμ€ν΄μ€μ μ μ₯μμλ νλ‘ν νμ 체μΈμ λ°λΌg
κ°μ²΄ μμ μ΄ μ§λλ λ©€λ²,Grade
μprototype
μ μλ λ©€λ²,Array.prototype
μ μλ λ©€λ², λμΌλ‘Object.prototype
μ μγ΄γ΄ λ©€λ²μκΉμ§ μ κ·Όν μ μκ² λλ€.
π μ 리β
- μ΄λ€ μμ±μ ν¨μλ₯Ό
new
μ°μ°μμ ν¨κΌ νΈμΆνλ©΄Constructor
μμ μ μλ λ΄μ©μ λ°νμΌλ‘ μλ‘μ΄ μΈμ€ν΄μ€κ° μμ±λλ€. μ΄ μΈμ€ν΄μ€μλ__proto__
λΌλ,Constructor
μprototype
νλ‘νΌν°λ₯Ό μ°Έμ‘°νλ νλ‘νΌν°κ° μλμΌλ‘ λΆμ¬λλ€. __proto__
λ μλ΅ κ°λ₯ν μμ±μ΄λΌμ, μΈμ€ν΄μ€λConstructor.prototype
μ λ©μλλ₯Ό λ§μΉ μμ μ λ©μλμΈ κ²μ²λΌ νΈμΆν μ μλ€.Constructor.prototype
μλconstructor
λΌλ νλ‘νΌν°κ° μλλ°, μ΄λ λ€μ μμ±μ ν¨μ μμ μ κ°λ¦¬ν¨λ€. μ΄ νλ‘νΌν°λ μΈμ€ν΄μ€κ° μμ μ μμ±μ ν¨μκ° λ¬΄μμΈμ§λ₯Ό μκ³ μ ν λ νμν μλ¨μ΄λ€.__proto__
λ°©ν₯μ κ³μ μ°Ύμκ°λ©΄ μ΅μ’ μ μΌλ‘λObject.prototype
μ λΉλνκ² λλ€. μ΄λ° μμΌλ‘__proto__
μμ λ€μ__proto__
λ₯Ό μ°Ύμκ°λ κ³Όμ μ νλ‘ν νμ 체μ΄λμ΄λΌκ³ νλ©°, μ΄ νλ‘ν νμ 체μ΄λμ ν΅ν΄ κ° νλ‘ν νμ λ©μλλ₯Ό μμ μ κ²μ²λΌ νΈμΆν μ μλ€. μ΄λ μ κ·Ό λ°©μμ μμ μΌλ‘λΆν° κ°μ₯ κ°κΉμ΄ λμλΆν° μ μ°¨ λ¨Ό λμμΌλ‘ λμκ°λ©°, μνλ κ°μ μ°ΎμΌλ©΄ κ²μμ μ€λ¨νλ€.Object.prototype
μλ λͺ¨λ λ°μ΄ν° νμ μμ μ¬μ©ν μ μλ λ²μ©μ μΈ λ©μλλ§μ΄ μ‘΄μ¬νλ©°, κ°μ²΄ μ μ© λ©μλλ μ¬λ λ°μ΄ν° νμ κ³Ό λ¬λ¦¬Object
μμ±μ ν¨μμ μ€νν±νκ² λ΄κ²¨μλ€.