Prototypes in Javascript

μžλ°”μŠ€ν¬λ¦½νŠΈ μ„Έκ³„μ˜ κ°€μ‘± 관계도λ₯Ό μ•Œμ•„λ³΄κ² λ‹€. πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦ (μ˜€μž‰?)

ν‚€μ›Œλ“œλŠ”

  • prototype (μ•„λΉ )

  • constructor (μ—„λ§ˆ)

  • instance (μžμ‹)

이 될 것이닀.

Prototype

μ΄λΌλŠ” 단어가 λœ»ν•˜λŠ” μ˜λ―ΈλŠ” μ›μ΄ˆμ μΈ ν˜•νƒœ , μ›λž˜μ˜ν˜•νƒœλ₯Ό λ§ν•œλ‹€.

Constructor

μƒμ„±μžν•¨μˆ˜ new ν‚€μ›Œλ“œμ™€ ν•¨κ»˜ μ“°μ΄λŠ” ν•¨μˆ˜λ₯Ό λ§ν•œλ‹€.

you don't konw js μ±…μ—μ„œμ˜ μ •μ˜λ„ μ°Ύμ•„λ³΄μž

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μƒμ„±μžλŠ” μ•žμ— new μ—°μ‚°μžκ°€ μžˆμ„ λ•Œ ν˜ΈμΆœλ˜λŠ” 일반 ν•¨μˆ˜μ— λΆˆκ³Όν•˜λ‹€. ν΄λž˜μŠ€μ— 뢙은 것도 μ•„λ‹ˆκ³  클래슀 μΈμŠ€ν„΄μŠ€ν™” κΈ°λŠ₯도 μ—†λ‹€. 심지어 νŠΉλ³„ν•œ ν˜•νƒœμ˜ ν•¨μˆ˜λ„ μ•„λ‹ˆλ‹€. 단지 newλ₯Ό μ‚¬μš©ν•˜μ—¬ ν˜ΈμΆœν•  λ•Œ μžλ™μœΌλ‘œ λΆ™λ“€λ € μ‹€ν–‰λ˜λŠ” κ·Έμ € ν‰λ²”ν•œ ν•¨μˆ˜λ‹€.

15.7.2 Number μƒμ„±μž(ES5.1λͺ…μ„Έ) new ν‘œν˜„μ‹μ˜ μΌλΆ€λ‘œ 호좜 μ‹œ NumberλŠ” μƒμ„±μžμ΄λ©° μƒˆλ‘œ λ§Œλ“€μ–΄μ§„ 객체λ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€.

newλ₯Ό λΆ™μ—¬μ„œ 호좜 ν•  수 있고 μ΄λŠ” κ²°κ΅­ μƒμ„±μž ν˜ΈμΆœμ΄λ‚˜ 닀름없닀. μƒμ„±μž ν•¨μˆ˜κ°€ μ•„λ‹ˆλΌ ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜λŠ” 호좜이라고 ν•΄μ•Ό μ˜³λ‹€.

μ—¬κΈ°μ„œ μ£Όλͺ©ν•˜κ²Œ λ˜λŠ” ν‚€μ›Œλ“œλ“€μ΄ μžˆλ‹€. μƒˆλ‘œ λ§Œλ“€μ–΄μ§„ 객체λ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€μ™€ ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜λŠ” 호좜 이해가 잘 λ˜λŠ” ν‚€μ›Œλ“œλ‹€!

λ˜ν•œ μΆ”κ°€λ‘œ newλ₯Ό λΆ™μ—¬ μƒμ„±μž ν˜ΈμΆœμ„ ν•˜λ©΄ μ–΄λ–€ 일이 μΌμ–΄λ‚˜λŠ”μ§€ κ°„λž΅ν•˜κ²Œ μ•Œμ•„λ³΄μž.

  • μƒˆ 객체가 툭 λ§Œλ“€μ–΄μ§„λ‹€.

  • μƒˆλ‘œ μƒμ„±λœ 객체의 [[Prototype]]이 μ—°κ²°λœλ‹€.

  • μƒˆλ‘œ μƒμ„±λœ κ°μ²΄λŠ” ν•΄λ‹Ή ν•¨μˆ˜ ν˜ΈμΆœμ‹œ this둜 바인딩 λœλ‹€.

  • 이 ν•¨μˆ˜κ°€ μžμ‹ μ˜ 또 λ‹€λ₯Έ 객체λ₯Ό λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ” ν•œ new와 ν•¨κ»˜ 호좜된 ν•¨μˆ˜λŠ” μžλ™μœΌλ‘œ μƒˆλ‘œ μƒμ„±λœ 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.

new ν‚€μ›Œλ“œμ™€ ν•¨κ»˜ μ“°μ΄λŠ” ν•¨μˆ˜

  • new Array(); - μ—¬κΈ°μ„œ μƒμ„±μž ν•¨μˆ˜λŠ” Array(); 이닀.

  • new Object();

  • new Function();

νŠΉμ§•μ΄ μžˆλŠ”λ° ν•¨μˆ˜λͺ…μ˜ μ²«κΈ€μžλŠ” λŒ€λ¬Έμžλ₯Ό μ“΄λ‹€.

μš°λ¦¬κ°€ μ§€κΈˆ κΉŒμ§€ μ΄λ ‡κ²Œ μ§μ ‘μ μœΌλ‘œ μ“°μ§€ μ•Šμ•˜μ–΄λ„ μš°νšŒν•΄μ„œ μ‚¬μš©ν–ˆμ„ 것이닀.

λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ κ°μ²΄λŠ” μƒμ„±μž ν•¨μˆ˜λ₯Ό ν†΅ν•΄μ„œ λ§Œλ“€μ–΄ 진것이닀!

var arr = [];
varr arr = new Array(); // 사싀상 λ˜‘κ°™μ€ 것이닀.

λ˜ν•œ μƒμ„±μž ν•¨μˆ˜λ„ ν•¨μˆ˜μ΄κ³  -> ν•¨μˆ˜λ„ 객체이닀. κ·Έλž˜μ„œ μƒμ„±μžν•¨μˆ˜λ„ -> 객체이닀. ν•¨μˆ˜μΈλ° 객체이닀? 이것이 λ¬΄μŠ¨λœ»μ΄λƒν•˜λ©΄ μƒμ„±μž ν•¨μˆ˜κ°€ 객체의 νŠΉμ§•μ„ κ°€μ§ˆ 수 μžˆλ‹€λŠ” 것이닀. κ·Έ νŠΉμ§•μ΄ 무엇인지 μ•Œμ•„λ³΄μž.

객체의 νŠΉμ§• key와 value둜 이루어져 μžˆλ‹€. μƒμ„±μž ν•¨μˆ˜λ„ Key와 valueλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€. μƒμ„±μž ν•¨μˆ˜μΈ Array() , Object(), Function()도 key와 valueλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ Array(), Object(), Function()은 κ³΅ν†΅μ μœΌλ‘œ μ“°μ΄λŠ”κ²ƒμ΄κΈ° λ•Œλ¬Έμ— λ”°λ‘œ key와 valueλŠ” λ§Œλ“€μ§€ μ•ŠλŠ”κ²Œ μ’‹λ‹€.

λ˜ν•œ μƒμ„±μž ν•¨μˆ˜λŠ” μ›ν•˜λ©΄ μš°λ¦¬κ°€ λ§Œλ“€ 수 μžˆλ‹€. μƒμ„±μž ν•¨μˆ˜μΈμ§€μ— λŒ€ν•œ μ •ν™•ν•œ νŒλ‹¨μ€ μ“°μž„μ— 따라 λ§žλƒ μ•„λ‹ˆλƒλ‘œ λ‚˜λ‰  수 μžˆλ‹€.

이제 ν•¨μˆ˜μ™€ prototype의 관계λ₯Ό μ•Œμ•„λ³΄μž.

ν•¨μˆ˜μ™€ prototype의 관계 - λͺ¨λ“  ν•¨μˆ˜λŠ” prototype 속성이 μžˆλ‹€!

ν•¨μˆ˜λ₯Ό λ§Œλ“€λ©΄ 무쑰건 prototypeμ΄λΌλŠ” 속성이 κ»΄μžˆλ‹€.

function foo () {
    return 3;
}
//λͺ¨λ“  ν•¨μˆ˜μ—λŠ” prototypeμ΄λΌλŠ” 속성을 κ°€μ§€κ³  μžˆλ‹€!
console.log(foo.prototype); // {constructor: Ζ’} 

function Foo () {
    return 3;
}
//λͺ¨λ“  ν•¨μˆ˜μ—λŠ” prototypeμ΄λΌλŠ” 속성을 κ°€μ§€κ³  μžˆλ‹€!
console.log(Foo.prototype); // {constructor: Ζ’}

μ½˜μ†”μ— 직접 찍어본닀면 μƒμ„±μž ν•¨μˆ˜κ°€ 맞던 μ•„λ‹ˆλ˜ ν•¨μˆ˜λͺ….prototype으둜 찍어보면 ν•¨μˆ˜λŠ” prototypeμ΄λΌλŠ” 속성을 κ°€μ§€κ³  있고 κ°’μœΌλ‘œλŠ” {constructor: Ζ’}λ₯Ό 확인 ν•  수 μžˆλ‹€.

prototype에 ν•΄λ‹Ήλ˜λŠ” valueλŠ” κ°μ²΄μž„μ„ 확인 ν•  수 μžˆλ‹€.

μ˜μ‚¬ μ½”λ“œλ‘œ μ„€λͺ…ν•œλ‹€λ©΄ Foo = { prototype: {} }둜 생각할 수 μžˆλ‹€.

prototype의 value둜 {}객체λ₯Ό κ°€μ§€κ³  있으며, κ·Έ 객체듀은 μžλ™μ μœΌλ‘œ key와 valueκ°€ μ„€μ •λ˜μ–΄μ Έ μžˆλ‹€. λ˜ν•œ constructor의 valueλŠ” μžκΈ°μžμ‹  Foo()둜 μ„€μ •λ˜μ–΄ μžˆλŠ” 것을 확인 ν•  수 μžˆλ‹€.

ConstructλŠ” .prototype 속성을 κ°€μ§€κ³  .prototype은 Prototype이라고 λΆˆλ¦¬λŠ” 객체λ₯Ό κ°€μ§€κ³  μžˆλ‹€.

  • μƒμ„±μž ν•¨μˆ˜λ₯Ό λ§Œλ“€μ—ˆλ‹€!(λͺ¨λ“ ν•¨μˆ˜ λ‹€ 포함이 κ°€λŠ₯ν•˜λ‹€)

  • μƒμ„±μž ν•¨μˆ˜λŠ” μžλ™μœΌλ‘œ prototypeμ΄λΌλŠ” 속성을 κ°€μ§€κ²Œ λœλ‹€.

  • 이 prototype 속성이 κ°–κ³  μžˆλŠ” valueλŠ” μ–΄λ–€ ν•˜λ‚˜μ˜ prototypeμ΄λΌλŠ” λΆ€λ₯΄λŠ” 객체이닀.

Prototype이라고 λΆˆλ¦¬λŠ” κ°μ²΄μ—λŠ” 항상 λ°˜λ“œμ‹œ .constructλΌλŠ” 속성을 κ°€μ§„λ‹€.

console둜 ν™•μΈν•΄λ³΄μž

ObjectλΌλŠ” μƒμ„±μž ν•¨μˆ˜κ°€ μžˆλ‹€.

prtotype 확인
  • 이 ObjectλΌλŠ” μƒμ„±μž ν•¨μˆ˜μ—λŠ” .prototypeμ΄λΌλŠ” 속성을 κ°€μ§€κ³  있고 이 .prototype은 Prototypeμ΄λΌλŠ” 객체λ₯Ό κ°€μ§€κ³  μžˆλ‹€.

prtotype 객체의 constructor속성 확인
  • prototypeμ΄λΌλŠ” κ°μ²΄μ—λŠ” constructorλΌλŠ” 속성이 μžˆλŠ”λ° κ·Έ 속성은 μƒμ„±μžν•¨μˆ˜λ₯Ό 가리킨닀.

prtotype 객체의 constructor속성 확인
  • constuctor속성은 constructorλ₯Ό 가리킨닀.

  • constructλŠ” 또 prototypeμ΄λΌλŠ” 속성을 κ°€μ§„λ‹€.

μ •λ¦¬ν•˜μžλ©΄

μƒμ„±μžν•¨μˆ˜μ™€ prototype의 관계
  • ConstructorλŠ” .prototyeμ΄λΌλŠ” 속성을 κ°€μ§„λ‹€.

  • .prototype속성은 Prototypeμ΄λΌλŠ” 객체λ₯Ό κ°€μ§„λ‹€.

  • Prototypeκ°μ²΄λŠ” .constructorλΌλŠ” 속성을 κ°€μ§€κ²Œ λœλ‹€.

  • .constructorλΌλŠ” 속성은 Constructorλ₯Ό κ°€λ¦¬ν‚€κ²Œ λœλ‹€.

  • ConstructorλŠ” λ‹€μ‹œ .prototypeμ΄λΌλŠ” 속성을 κ°€μ§€κ²Œ λœλ‹€.

이둜써 Constroctor와 Prototype은 .prototypeκ³Ό .constructor 속성은 κ°€μ§€κ³  κ·Έ 속성은 prototypeμ΄λΌλŠ” 객체와 Constructorλ₯Ό 가리킀기 λ•Œλ¬Έμ— μ„œλ‘œκ°€ μ„œλ‘œλ₯Ό κ°€λ¦¬ν‚€κ²Œ λœλ‹€.

λ‚¨νŽΈκ³Ό μ•„λ‚΄λ‘œ λΉ„μœ ν•΄ 보자 πŸ’‘

μƒμ„±μžν•¨μˆ˜μ™€ prototype의 관계

constructorκ°€ λ‚¨νŽΈμ΄ 되고 prototype은 μ•„λ‚΄κ°€ λœλ‹€. κ·Έλ¦Όκ³Ό 같이 λ‚¨νŽΈκ³Ό μ•„λ‚΄λ₯Ό λΆ€λ₯΄λŠ” 방법을 λΉ¨κ°„ ν™”μ‚΄ν‘œλŒ€λ‘œ λΆ€λ₯Ό 수 μžˆλ‹€κ³  μƒκ°ν•˜λ©΄ 쒀더 쉽닀!

πŸŒŸμ‹€μ œλ‘œ μž‘μ—…μ„ ν•  λ•Œμ—” μ“°μ§„ μ•ŠλŠ”λ‹€.

Instance πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦

(ν•œκ°€μ§€μ˜) 경우

var obj = new Object();

newλ₯Ό 톡해 μƒμ„±μžν•¨μˆ˜λ₯Ό 호좜 ν•˜λ©΄ 객체λ₯Ό 리턴해쀀닀. μƒμ„±μžν•¨μˆ˜λŠ” 무쑰건 thisλ₯Ό returnν•΄μ£Όκ³  thisλŠ” 객체이닀.

new Object()λ₯Ό ν•œ 결과물을 μΈμŠ€ν„΄μŠ€λΌκ³  λΆ€λ₯Έλ‹€. 두λ‘₯

function Foo() {}
var k = new Foo();

new Foo();λΌλŠ” 것은 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“œλŠ” 것인데 이것은 Foo의 μΈμŠ€ν„΄μŠ€λΌκ³  λ§ν•œλ‹€.

var a = new Array();
var b = new Array();

var a = [];
var b = [];

console.log(a === b) // false

μœ„μ— 두쀄이 λ˜‘κ°™λ‹€κ³  말 ν•  μˆ˜μžˆλ‹€. ν•˜μ§€λ§Œ a와 bλŠ” κ°™λ‹€κ³  ν•  수 μ—†λ‹€.

λ°©κΈˆμ „ λ‚¨νŽΈκ³Ό 아내에 λΉ„μœ λ₯Ό ν•˜μ˜€λŠ”λ° instanceλŠ” λ‚¨νŽΈκ³Ό μ•„λ‚΄μ˜ 결과물이라고 μƒκ°ν•΄λ³΄μž.

var obj = new Object();
  • μ—¬κΈ°μ„œ λ‚¨νŽΈμ€? Objectκ°€ λœλ‹€.

  • μ—¬κΈ°μ„œ μ•„λ‚΄λŠ”? Object.prtotype이 λœλ‹€.

function Foo() {}

var f = new Foo();
  • fλŠ” μ• κΈ°λ‹€.

  • Fooκ°€ μ•„λΉ κ°€ λœλ‹€.

  • Foo.prtotype이 μ—„λ§ˆκ°€ λœλ‹€.

Prototype chain! πŸ‘©β€πŸ‘§

var obj = {};
  • λ‚¨νŽΈ

    • Objec

  • λ‚¨νŽΈμ˜ μ•„λ‚΄

    • Objec

  • 근데 μžμ‹μ΄? constructorλ₯Ό μ‚¬μš© ν•  수 μžˆλ‹€?

    • Objec

.constructorλŠ” μ—„λ§ˆ 즉 Prototype이 κ°€μ§€λŠ” 속성이 μ˜€λ‹€.

obj에겐 아무것도 ν• λ‹Ήν•˜μ§€ μ•Šμ•˜λŠ”λ° constructorλ₯Ό κ°€μ§ˆ 수 μ—†λŠ” 상황이닀.

이게 λ¬΄μŠ¨μΌμ΄λƒ???! μžμ‹μ΄ μ—„λ§ˆμ˜ 물건을 μŠ¬μ©ν•œ 상황이닀.

μžμ‹μ€ 일단 μžμ‹ μ΄ κ°€μ§€κ³  μžˆλŠ”μ§€ ν™•μΈν•œ ν›„! 체크체크 -> μ—†λ‹€λ©΄ μ—„λ§ˆκ»„ 슬쩍 ν•œλ‹€.

var obj = {};

Object.prototype.haha = 123; // μ—„λ§ˆμ—κ²Œ hahaλΌλŠ” 속성을 섀정해쀬닀.

console.log(obj.haha) // 123

objμ—κ²Œ hahaλ₯Ό λ§Œλ“€μ–΄ μ£Όμ§€ μ•Šμ•˜λŠ”λ°! hahaλ₯Ό 가짐! πŸ‘©β€πŸ‘§

μΈμŠ€ν„΄μŠ€(μžμ‹)λŠ” μžμ‹ μ΄ λ­”κ°€λ₯Ό ν•„μš”λ‘œ ν•  λ•Œ λ¨Όμ € 양심껏 μžμ‹ μ΄ κ°€μ§€κ³  μžˆλŠ”μ§€ 확인 ν•œ ν›„ μ—†λ‹€λ©΄ prototype(μ—„λ§ˆ)μ—μ„œ μ°ΎλŠ”λ‹€.

그림으둜 ν™•μΈν•œλ‹€λ©΄

instance

Dunder Proto

proto μ΄λ ‡κ²Œ 생긴걸 Dunder Proto라고 ν•œλ‹€.

Objec a λΌλŠ” instanceλ₯Ό 생성후 aλ₯Ό console에 찍어보면 {} λΉˆκ°μ²΄κ°€ 보인닀. κ·Έ μ•ˆμ„ 열어보면 Prototype(μ—„λ§ˆ)κ°€ κ°€μ§€λŠ” 속성과 값이 μžˆλ‹€! {constructior: Object} μ—„λ§ˆμ˜ 정보λ₯Ό μ €μž₯ν•΄ 놓은 것이닀.

function Person (name) {
  this.name = name;
}

// Person === λ‚¨νŽΈ
// Person.prototype === λ‚¨νŽΈμ˜ μ•„λ‚΄

// 아이 생성
var kennim = new Person('ken ken');

kennim.constructor === Person;
kennim.__proto__ === Person.prototype;

λ§ˆμ§€λ§‰ 2쀄을 μžμ„Ένžˆ μ‚΄νŽ΄λ³΄μž.

kennim.constructor === Person;

kennimμ—λŠ” constructorλΌλŠ” 속성이 μ—†λ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ—„λ§ˆμΈ prototypeμ—μ„œ μ‚΄νŽ΄λ³Ό 것이고, prototype은 .constructorλΌλŠ”κ±Έ κ°€μ§€κ³  μžˆλ‹€. 이 .constructλŠ” μ•„λΉ λ₯Ό 바라본닀. μ•„λΉ λŠ” Constructorκ³  그것은 Person이기 λ•Œλ¬Έμ— trueλ‹€!

kennim.__proto__ === Person.prototype;

μ•„κΉŒ μœ„μ—μ„œ 봀듯이 Dunder protoλŠ” Prototype이 κ°€μ§„ 정보λ₯Ό κ°€μ§€κ³  μžˆμ—ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— true

var o = new Object();

o.costructor === Object();

o.constructor = function bar () {}

console.log(o.constructor === Object); // false;

o μΈμŠ€ν„΄μŠ€ μžμ‹μ΄ κ°€μ§„ constructorλ₯Ό κ°€μž₯ λ¨Όμ € μ°ΎλŠ”λ° 그것은 bar function 이기 λ•Œλ¬Έμ— falseκ°€ λœλ‹€.

Dunder Proto
  • μžμ‹μ΄ μ—„λ§ˆμ—κ²Œ μ ‘κ·Όν•˜κ³ μž ν•  λ•Œ Dunder proto둜 ν•  수 있긴 ν•˜λ‹€. ν•˜μ§€λ§Œ ν•˜λ©΄ μ•ˆλœλ‹€.

  • μ €κ±Έ μ“°μ—¬μ•Ό ν•˜λŠ” 상황은 μ½”λ“œκ°€ μ œλŒ€λ‘œ μ§œμ—¬μžˆμ§€ μ•Šλ‹€λŠ” 것이기 λ•Œλ¬Έμ— κ·Έ 였λ₯˜λ₯Ό ν•΄κ²°ν•΄μ•Όμ§€ μ ‘κ·Όν•˜λ©΄ μ•ˆλœλ‹€.

μ—„λ§ˆμ•„λΉ λ„ μ—„λ§ˆμ•„λΉ κ°€ μžˆλ‹€.

function Foo () {} // μƒμ„±μžν•¨μˆ˜ - μ•„λΉ 

console.log(Foo.prototype); // μƒμ„±μžν•¨μˆ˜.prototype - μ—„λ§ˆ

console.log(typeof Foo.prototype) // 객체닀. 객체가 μ–΄λ–»κ²Œ λ§Œλ“€μ–΄ μ§€λŠ”κ°€? new Object() μ΄λ ‡κ²Œλ‹€.

// Foo.prototype μ–˜ λ˜ν•œ λˆ„κ΅°κ°€μ˜ μžμ‹μ΄λž€ 말이닀.

Foo.prototype μ–˜μ˜ μ—„λ§ˆλŠ” λˆ„κ΅΄κΉŒ?**

Foo.prototype λ˜ν•œ 객체 instanceλ‹€. key와 valueλ₯Ό κ°€μ‘Œλ‹€. μ•„λΉ λŠ” μƒμ„±μž ν•¨μˆ˜λ‹€ Foo.prototype의 μ•„λΉ λŠ” λˆ„κ΅¬μΌκΉŒ?

μ–˜μ—κ²Œλ„ μ—„λ§ˆμ˜ 정보λ₯Ό κ°€μ§„ __proto__κ°€ μžˆλ‹€.

Dunder Proto μ—„λ§ˆμ˜ 정보가 λ‚˜μ™”λ‹€.

잠깐 Object.prototype을 ν™•μΈν•˜μž.

Dunder Proto 이 μ •λ³΄λŠ” Foo.prototype. proto 와 Object.proto와 λ˜‘κ°™λ‹€.

μ΄λŸ¬ν•œ μ΄μœ λŠ” Foo.prototype도 new Object();둜 λ§Œλ“€μ–΄μ§„ ν•˜λ‚˜μ˜ intance이기 λ•Œλ¬Έμ΄λ‹€.

Foo.prototype.proto === Object.prototype;

Foo.prototype.__proto__ === Object.prototype; // true;

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ—„λ§ˆμ˜ μ—„λ§ˆμ˜ 정보인 Foo.prototype. proto 은 Object의 아내인 Object.prototypeκ³Ό λ™μΌν•˜λ‹€λŠ” κ²°κ³Όλ₯Ό 얻을 수 μžˆλ‹€. 🀭

Dunder Proto μ§€κΈˆ μ ‘κ·Όν•œ 상황을 그림으둜 그리게 되면 μ΄λ ‡κ²Œ λ˜λŠ” 것이닀. (이것이 λ§ˆμ§€λ§‰ 그림이길 λΉˆλ‹€...)

  • λ‚¨νŽΈμ€ Foo

  • λ‚¨νŽΈμ˜ μ•„λ‚΄λŠ” Foo.prototype

  • λ‚¨νŽΈμ˜ μ•„λ‚΄μ˜ μ—„λ§ˆμ˜ μ •λ³΄λŠ” Foo.prototype. proto 둜 μ ‘κ·Ό

  • λ‚¨νŽΈμ˜ μ•„λ‚΄μ˜ μ—„λ§ˆλŠ” μ‹€μ œ Object.prototype 이닀. μ›Œν›„ 🀧

그럼 Object의 μ•„λ‚΄μ˜ μ—„λ§ˆλŠ” λˆ„κ΅΄κΉŒ?

console.log(Object.prototype.__proto__) // null;

μ‹œμŠ€ν…œμƒ null, Object의 μ•„λ‚΄λŠ”..μ‘₯κ³Ό λ§ˆλŠ˜μ„..λ¨Ή...(..)

가쑱관계λ₯Ό μ§μ ‘ν™•μΈν•΄λ³΄μž

κ°€μ‘±κ΄€κ³„νŒŒμ•…μ΄ λλ‚˜λ‹ˆ λ‹€μ‹œ ν•œλ²ˆ ν™•μΈν•˜κ³ μž ν•˜λŠ” μš•κ΅¬κ°€ 생겼닀.

function Father() {}
var baby = new Father();

// __proto__λ₯Ό μ΄μš©ν•΄ μ—„λ§ˆμ—κ²Œ μ ‘κ·Ό
baby.__proto__ === Father.prototype; 

// μ—„λ§ˆ(prototype)κ°€ κ°€μ§„ constructorλ₯Ό μ΄μš©ν•΄ μ•„λΉ μ—κ²Œ μ ‘κ·Ό
baby.constructor === Father;

//__proto__ 둜 ν• λ¨Έλ‹ˆμ—κ²Œλ„ μ ‘κ·Ό
baby.__proto__.__proto__ === Object.prototype;

//ν• λ¨Έλ‹ˆκ°€ λ§žλŠ”κ°€?λ₯Ό μ—„λ§ˆλ‘œ 체크해보면 falseκ°€ λ‚˜μ˜¨λ‹€.
baby.__proto__ === Object.prototype;

prototype chain은 μ΅œμ’… ObjectκΉŒμ§€ μ˜¬λΌκ°„λ‹€

function Foo() {}
var f = new Foo();

Object.prototype.haha = 123;

console.log(f.haha); // 123

Inheritance(상속)이 μ•„λ‹ˆλΌ Behavior Delegation(행동을 μœ„μž„, λŒ€λ¦¬)이닀.

ν•„μš”ν•  λ•Œλ§ˆλ‹€ 뢀탁을 ν•˜λŠ”κ²ƒμ΄μ§€ 상속 λ°›μ€κ²Œ μ•„λ‹ˆλ‹€.

Last updated

Was this helpful?