본문으둜 κ±΄λ„ˆλ›°κΈ°

🌈 Chapter 6: ν”„λ‘œν† νƒ€μž…

  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”„λ‘œν† νƒ€μž… 기반 언어이닀.
  • ν”„λ‘œν† νƒ€μž… 기반 μ–Έμ–΄μ—μ„œλŠ” μ–΄λ–€ 객체λ₯Ό μ›ν˜•(prototype)으둜 μ‚Όκ³  이λ₯Ό 볡제(μ°Έμ‘°)ν•¨μœΌλ‘œμ¨ 상속과 같은 효과λ₯Ό μ–»λŠ”λ‹€.

πŸ“š ν”„λ‘œν† νƒ€μž…μ˜ κ°œλ… 이해​

🎈 constructor, prototype, instance​

var instance = new Constructor();
  1. μ–΄λ–€ μƒμ„±μž ν•¨μˆ˜(Constructor)λ₯Ό new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•˜λ©΄
  2. Constructorμ—μ„œ μ •μ˜λœ λ‚΄μš©μ„ λ°”νƒ•μœΌλ‘œ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λœλ‹€.
  3. μ΄λ•Œ instanceμ—λŠ” __proto__λΌλŠ” ν”„λ‘œνΌν‹°κ°€ μžλ™μœΌλ‘œ λΆ€μ—¬λ˜λŠ”λ°,
  4. 이 ν”„λ‘œνΌν‹°λŠ” 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 μƒμ„±μž ν•¨μˆ˜μ— μŠ€νƒœν‹±ν•˜κ²Œ λ‹΄κ²¨μžˆλ‹€.