FRONTEND/JavaScript

[JavaScript] ν”„λ‘œν† νƒ€μž…(prototype)μ΄λž€?

λ…œνž 2022. 3. 11. 14:04
λ°˜μ‘ν˜•

πŸ€” ν”„λ‘œν† νƒ€μž…μ„ μ•„μ‹œλ‚˜μš”? 

 

Javascriptμ—μ„œλŠ” 객체λ₯Ό μƒμ†ν•˜κΈ° μœ„ν•΄ ν”„λ‘œν† νƒ€μž…μ΄λΌλŠ” 방식을 μ‚¬μš©ν•©λ‹ˆλ‹€. 

 

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”νžˆ ν”„λ‘œν† νƒ€μž… 기반 언어라 λΆˆλ¦½λ‹ˆλ‹€. λͺ¨λ“  객체듀이 λ©”μ†Œλ“œμ™€ 속성듀을 상속받기 μœ„ν•œ ν…œν”Œλ¦ΏμœΌλ‘œμ¨ ν”„λ‘œν† νƒ€μž… 객체λ₯Ό κ°€μ§„λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. ν”„λ‘œν† νƒ€μž… 객체도 또 λ‹€μ‹œ μƒμœ„ ν”„λ‘œν† νƒ€μž… κ°μ²΄λ‘œλΆ€ν„° λ©”μ†Œλ“œμ™€ 속성을 상속받을 μˆ˜λ„ 있고 κ·Έ μƒμœ„ ν”„λ‘œν† νƒ€μž… 객체도 λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. 이λ₯Ό ν”„λ‘œν† νƒ€μž… 체인이라 λΆ€λ₯΄λ©° λ‹€λ₯Έ 객체에 μ •μ˜λœ λ©”μ†Œλ“œμ™€ 속성을 ν•œ κ°μ²΄μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜λŠ” κ·Όκ°„μž…λ‹ˆλ‹€. 

 

μ •ν™•νžˆ λ§ν•˜μžλ©΄ μƒμ†λ˜λŠ” 속성과 λ©”μ†Œλ“œλ“€μ€ 각 객체가 μ•„λ‹ˆλΌ 객체의 μƒμ„±μžμ˜ prototypeμ΄λΌλŠ” 속성에 μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

 

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 객체 μΈμŠ€ν„΄μŠ€μ™€ ν”„λ‘œν† νƒ€μž… 간에 연결이 κ΅¬μ„±λ˜λ©° 이 연결을 따라 ν”„λ‘œν† νƒ€μž… 체인을 타고 μ˜¬λΌκ°€λ©° 속성과 λ©”μ†Œλ“œλ₯Ό νƒμƒ‰ν•©λ‹ˆλ‹€. 

 

 

λ‹€μŒκ³Ό 같은 μƒμ„±μž ν•¨μˆ˜λ₯Ό ν•˜λ‚˜ μ •μ˜ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

function Person(first, last, age, gender, interests){
    // 속성과 λ©”μ†Œλ“œ μ •μ˜
    this.first = first;
    this.last = last;
    // . . .
}

μƒμ„±μž ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ μΈμŠ€ν„΄μŠ€λ„ ν•˜λ‚˜ λ§Œλ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

var person1 = new Person('Bob', 'Smith', 32, 'male', ['music', 'skiing']);

 

μžλ°”μŠ€ν¬λ¦½νŠΈ μ½˜μ†”μ—μ„œ "person1." 을 치게 되면 λΈŒλΌμš°μ €λŠ” μ•„λž˜μ²˜λŸΌ ν•΄λ‹Ή 객체의 멀버 이름을 μžλ™μ™„μ„± νŒμ—…μœΌλ‘œ 보여쀄 κ²ƒμž…λ‹ˆλ‹€. 

μœ„μ—μ„œ person1의 ν”„λ‘œν† νƒ€μž… 객체인 Person( )에 μ •μ˜λœ 멀버듀 name, age, gender, interest, bio, greeting을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ watch, valueOf 처럼 Person( )의 ν”„λ‘œν† νƒ€μž… 객체인 Object에 μ •μ˜λœ λ‹€λ₯Έ 멀버듀도 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” ν”„λ‘œν† νƒ€μž… 체인이 λ™μž‘ν•œλ‹€λŠ” μ¦κ±°μž…λ‹ˆλ‹€. 

 

그럼 μ‹€μ œλ‘œ Object에 μ •μ˜λ˜μ–΄ μžˆλŠ” λ©”μ†Œλ“œλ₯Ό person1μ—μ„œ ν˜ΈμΆœν•˜κ²Œ 되면 μ–΄λ–»κ²Œ λ κΉŒμš”?

person1.valueOf();

1) λΈŒλΌμš°μ €λŠ” μš°μ„  person1 객체가 valueOf( ) λ©”μ†Œλ“œλ₯Ό κ°€μ§€κ³  μžˆλŠ”μ§€ μ²΄ν¬ν•©λ‹ˆλ‹€.

2) μ—†μœΌλ―€λ‘œ person1의 ν”„λ‘œν† νƒ€μž… 객체 (Person( ) μƒμ„±μžμ˜ ν”„λ‘œν† νƒ€μž…)에 valueOf( ) λ©”μ†Œλ“œκ°€ μžˆλŠ”μ§€ μ²΄ν¬ν•©λ‹ˆλ‹€.

3) μ—¬μ „νžˆ μ—†μœΌλ―€λ‘œ Person() μƒμ„±μžμ˜ ν”„λ‘œν† νƒ€μž… 객체의 ν”„λ‘œν† νƒ€μž… 객체 (Object( ) μƒμ„±μžμ˜ ν”„λ‘œν† νƒ€μž…)κ°€ valueOf( ) λ©”μ†Œλ“œλ₯Ό κ°€μ§€κ³  μžˆλŠ”μ§€ μ²΄ν¬ν•©λ‹ˆλ‹€. 여기에 μžˆμœΌλ‹ˆ ν˜ΈμΆœν•˜λ©° λλ‚©λ‹ˆλ‹€.

 

 

πŸ“Œ ν”„λ‘œν† νƒ€μž… μ²΄μΈμ—μ„œ ν•œ 객체의 λ©”μ†Œλ“œμ™€ 속성듀이 λ‹€λ₯Έ 객체둜 λ³΅μ‚¬λ˜λŠ” 것이 μ•„λ‹™λ‹ˆλ‹€. 체인을 타고 μ˜¬λΌκ°€λ©° μ ‘κ·Όν•  λΏμž…λ‹ˆλ‹€. 

 

 

 

πŸ€” ν”„λ‘œν† νƒ€μž… 속성 : 상속받은 멀버듀이 μ •μ˜λœ κ³³

 

그럼 상속받은 속성과 λ©”μ†Œλ“œλ“€μ€ 어디에 μ •μ˜λ˜μ–΄ μžˆμ„κΉŒμš”?

object 레퍼런슀 νŽ˜μ΄μ§€μ— κ°€μ‹œλ©΄ μ’ŒμΈ‘μ— μˆ˜λ§Žμ€ 속성과 λ©”μ†Œλ“œλ“€μ΄ λ‚˜μ—΄λ˜μ–΄ μžˆλŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

μœ„ μŠ€ν¬λ¦°μƒ·μ—μ„œ person1κ°€ 상속받은 멀버듀보닀 훨씬 맍죠. μΌλΆ€λŠ” μƒμ†λ˜μ—ˆμ§€λ§Œ λ‚˜λ¨Έμ§€λŠ” μ•„λ‹ˆλ„€μš”. μ™œμΌκΉŒμš”?

 

정닡은...

상속받은 멀버듀은 prototype 속성에 μ •μ˜λ˜μ–΄ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

Object. 둜 μ‹œμž‘ν•˜λŠ”κ²Œ μ•„λ‹ˆλΌ, Object.prototype. 으둜 μ‹œμž‘ν•˜λŠ” 것듀이죠. prototype 속성도 ν•˜λ‚˜μ˜ 객체이며 ν”„λ‘œν† νƒ€μž… 체인을 톡해 μƒμ†ν•˜κ³ μž ν•˜λŠ” 속성과 λ©”μ†Œλ“œλ₯Ό λ‹΄μ•„λ‘λŠ” λ²„ν‚·μœΌλ‘œ 주둜 μ‚¬μš©λ˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€.

 

κ·Έλž˜μ„œ Object.prototype.watch( ), Object.prototype.valueOf( ) 등등은, μƒμ„±μžλ₯Ό 톡해 μƒˆλ‘œ μƒμ„±λ˜λŠ” μΈμŠ€ν„΄μŠ€λŠ” λ¬Όλ‘  Object.prototype 을 μƒμ†λ°›λŠ” 객체라면 μ–΄λ–€ κ°μ²΄μ—μ„œλ“ μ§€ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

 

Object.is( ), Object.keys( ) λ“± prototype 버킷에 μ •μ˜λ˜μ§€ μ•Šμ€ 멀버듀은 μƒμ†λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이것듀은 Object( ) μƒμ„±μžμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλŠ” 멀버듀이죠.

 

 

JavaScript μ „λ°˜μ— 걸쳐 ν”„λ‘œν† νƒ€μž… 체인 상속이 μ–΄λ–»κ²Œ κ΅¬μ„±λ˜μ–΄ μžˆλŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 

전역객체인 String, Date, Number, Array의 ν”„λ‘œν† νƒ€μž…μ— μ •μ˜λœ λ©”μ†Œλ“œμ™€ 속성듀을 μ²΄ν¬ν•΄λ³΄μ„Έμš”. 이 ν”„λ‘œν† νƒ€μž… κ°μ²΄λ“€μ—λŠ” 이미 λ§Žμ€ 수의 λ©”μ†Œλ“œκ°€ μ •μ˜λ˜μ–΄ 있으며 μ΄λŠ” μ•„λž˜μ²˜λŸΌ λ¬Έμžμ—΄ 객체λ₯Ό μƒμ„±ν–ˆμ„ λ•Œ

var myString = 'This is my string.';

myString μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜λŠ” μ¦‰μ‹œ split(), indexOf(), replace() λ“±μ˜ λ¬Έμžμ—΄μ„ μœ„ν•œ μœ μš©ν•œ λ©”μ†Œλ“œλ“€μ„ μ‚¬μš©ν•  수 μžˆλŠ” μ΄μœ μž…λ‹ˆλ‹€. 

λ°˜μ‘ν˜•