18μž₯ 일급 객체

일급 κ°μ²΄λž€?

  • 무λͺ…μ˜ λ¦¬ν„°λŸ΄λ‘œ 생성 ν•  수 있음
  • λ³€μˆ˜λ‚˜ 자료ꡬ쑰(객체,λ°°μ—΄ λ“±)에 μ €μž₯ν•  수 있음
  • ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ— 전달할 수 있음
  • ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©ν•  수 있음

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” μœ„μ˜ 쑰건을 λͺ¨λ‘ λ§Œμ‘±ν•˜λ―€λ‘œ 일급 객체라고 λΆˆλ¦½λ‹ˆλ‹€.

<script>
// ν•¨μˆ˜λŠ” 무λͺ…μ˜ λ¦¬ν„°λŸ΄λ‘œ 생성할 수 있음
// ν•¨μˆ˜λŠ” λ³€μˆ˜(객체, λ°°μ—΄ λ“±)에 μ €μž₯ν•  수 있음
const increase = function (num) {
	return ++num;
}

const decrease = function (num) {
	return --num;
}

// ν•¨μˆ˜λŠ” λ³€μˆ˜(객체, λ°°μ—΄ λ“±)에 μ €μž₯ν•  수 있음
const predicates = { increase, decrease };

// ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ— 전달 κ°€λŠ₯
// ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš© κ°€λŠ₯
function makeCounter(predicate) {
	let num = 0;
    
    return function () {
    	num = predicate(num);
        return num;
    };
  }
  
  // ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜μ—κ²Œ ν•¨μˆ˜λ₯Ό 전달 κ°€λŠ₯함
  const increaser = makeCounter(predicates.increase);
  console.log(increaser()); // 1
  console.log(increaser()); // 2
  
    const decreaser = makeCounter(predicates.decrease);
  console.log(increaser()); // -1
  console.log(increaser()); // -2
</script>

ν•¨μˆ˜κ°€ 일급 κ°μ²΄λΌλŠ” 것은 ν•¨μˆ˜λ₯Ό 객체와 λ™μΌν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” μ˜λ―ΈλΌκ³ ν•©λ‹ˆλ‹€.
κ°μ²΄λŠ” κ°’μ΄λ―€λ‘œ ν•¨μˆ˜λŠ” κ°’κ³Ό λ™μΌν•˜κ²Œ μ·¨κΈ‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
즉 ν•¨μˆ˜λŠ” 값을 μ‚¬μš©ν•  수 μžˆλŠ” κ³³(λ³€μˆ˜ ν• λ‹Ήλ¬Έ,객체의 ν”„λ‘œνΌν‹° κ°’,λ°°μ—΄μ˜ μš”μ†Œ,ν•¨μˆ˜ 호좜의 인수, ν•¨μˆ˜ λ°˜ν™˜λ¬Έ)이라면 μ–΄λ””μ„œλ“ μ§€ λ¦¬ν„°λŸ΄λ‘œ μ •μ˜ν•  수 있으며 λŸ°νƒ€μž„μ— ν•¨μˆ˜ 객체둜 ν‰κ°€λœλ‹€κ³  ν•©λ‹ˆλ‹€.

일급 κ°μ²΄λ‘œμ„œ ν•¨μˆ˜κ°€ κ°€μ§€λŠ” κ°€μž₯ 큰 νŠΉμ§•μ€

일반 객체와 같이 ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ— 전달할 수 있으며, 
ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ΄λŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ κ°€λŠ₯μΌ€ ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μž₯점 쀑 ν•˜λ‚˜λΌκ³ ν•©λ‹ˆλ‹€.

ν•¨μˆ˜λŠ” κ°μ²΄μ΄μ§€λ§Œ 일반 객체와 차이가 μžˆμŠ΅λ‹ˆλ‹€.
일반 객체 : 호좜 λΆˆκ°€λŠ₯
ν•¨μˆ˜ 객체 : 호좜 κ°€λŠ₯ , μΌλ°˜κ°μ²΄μ— μ—†λŠ” ν•¨μˆ˜ 고유의 ν”„λ‘œνΌν‹° μ†Œμœ 

ν•¨μˆ˜ 고유의 ν”„λ‘œνΌν‹°λž€?

ν•¨μˆ˜ 객체의 ν”„λ‘œνΌν‹°λŠ” arguments caller length name prototype 이 μ‘΄μž¬ν•©λ‹ˆλ‹€.
이 ν•¨μˆ˜ 객체의 데이터 ν”„λ‘œνΌν‹°λŠ” 일반 객체에 μ—†λŠ” ν•¨μˆ˜ 객체 고유의 ν”„λ‘œνΌν‹°λΌκ³  ν•©λ‹ˆλ‹€.

19μž₯ ν”„λ‘œν† νƒ€μž…

ν”„λ‘œν† νƒ€μž…μ΄λž€?

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”„λ‘œν† νƒ€μž… 기반 μ–Έμ–΄λ‘œ, 객체 κ°„ 상속을 ν”„λ‘œν† νƒ€μž… 체인을 톡해 κ΅¬ν˜„ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œ ν”„λ‘œν† νƒ€μž…μ€ 객체의 μ›ν˜•μ΄λΌ ν•  수 있으며, 각 κ°μ²΄λŠ” μžμ‹ μ˜ λΆ€λͺ¨ 역할을 ν•˜λŠ” ν”„λ‘œν† νƒ€μž…μ„ κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 ν”„λ‘œν† νƒ€μž…μ€ μƒμœ„ 객체의 데이터와 λ©”μ†Œλ“œλ₯Ό μžμ‹ κ°μ²΄μ—κ²Œ μƒμ†ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.

특히 ν•¨μˆ˜ κ°μ²΄λŠ” prototypeμ΄λΌλŠ” νŠΉμˆ˜ν•œ ν”„λ‘œνΌν‹°λ₯Ό κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 prototype ν”„λ‘œνΌν‹°λ₯Ό 톡해 μƒμ„±μž ν•¨μˆ˜λŠ” μžμ‹ μ΄ 생성할 μΈμŠ€ν„΄μŠ€μ—κ²Œ ν”„λ‘œν† νƒ€μž… 객체에 μžˆλŠ” 데이터와 λ©”μ†Œλ“œλ₯Ό μƒμ†ν•©λ‹ˆλ‹€. μ΄λŠ” μΈμŠ€ν„΄μŠ€κ°€ ν•΄λ‹Ή 데이터와 λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

μ‹€μ œλ‘œ μΈμŠ€ν„΄μŠ€μ—μ„œ νŠΉμ • 킀에 μ ‘κ·Όν•  λ•Œ, ν•΄λ‹Ή 객체에 ν•΄λ‹Ή ν‚€κ°€ μ—†λ‹€λ©΄ μƒμœ„ ν”„λ‘œν† νƒ€μž…μ—μ„œ μ°Ύμ•„λ‚˜κ°€λŠ”λ°, 이λ₯Ό ν”„λ‘œν† νƒ€μž… 체인이라고 λΆ€λ¦…λ‹ˆλ‹€. 즉, λΆ€λͺ¨ κ°μ²΄μ—μ„œλ„ μ°Ύμ§€ λͺ»ν•˜λ©΄ 더 μƒμœ„ ν”„λ‘œν† νƒ€μž…μœΌλ‘œ μ΄λ™ν•˜μ—¬ κ³„μ†ν•΄μ„œ μ°Ύμ•„ λ‚˜κ°‘λ‹ˆλ‹€.

μ΄λŸ¬ν•œ ν”„λ‘œν† νƒ€μž… 체인을 톡해 μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μœ μ—°ν•˜κ²Œ 객체 κ°„ 상속을 κ΅¬ν˜„ν•˜λ©°, μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±κ³Ό ν™•μž₯성을 λ†’μ΄λŠ” 효과λ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

<script>
const arr = [3,2,1];

arr.sort(); // [1,2,3]
arr; // [1,2,3]
</script>

λ°°μ—΄ μžλ£Œν˜•μ„ 담은 λ³€μˆ˜μ—μ„œ sort λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” μ΄μœ λŠ”
λ­”κ°€ λ‚΄λΆ€μ μœΌλ‘œ λ°°μ—΄ μžλ£Œν˜•μ—λŠ” μœ„ λ©”μ†Œλ“œλ₯Ό μ“Έ 수 있게 μ²˜λ¦¬ν•΄ λ†“μ•˜κΈ° λ•Œλ¬ΈμΌ 것 μž…λ‹ˆλ‹€.
λ°”λ‘œ μƒμ†μ΄λΌλŠ” κ°œλ…μ„ ν†΅ν•΄μ„œ 처리 λ˜μ—ˆμ„κ²λ‹ˆλ‹€.

λ‚΄λΆ€μ μœΌλ‘œ new Array() ν•¨μˆ˜κ°™μ€ μƒμ„±μž ν•¨μˆ˜λ₯Ό μ„ μ–Έν•΄μ„œ sort 같은 λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Array.prototype을 μ‚΄νŽ΄λ³΄λ©΄ sort,push,pop λ“±,
Array둜 μƒμ„±ν•œ λͺ¨λ“  λ°°μ—΄ μΈμŠ€ν„΄μŠ€λŠ” ν•΄λ‹Ή ν”„λ‘œν† νƒ€μž…μ— μžˆλŠ” 데이터, λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘œν† νƒ€μž… μ²΄μΈμ΄λž€?

μΈμŠ€ν„΄μŠ€ 객체의 key에 μ ‘κ·Όν•  λ•Œ, ν•΄λ‹Ή κ°μ²΄μ—κ²Œ keyκ°€ μ—†λ‹€λ©΄ κ·Έ λ‹€μŒμœΌλ‘œ μƒμœ„ ν”„λ‘œν† νƒ€μž…(μ›ν˜•) μ†μ„±μ—μ„œ keyκ°€ μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
μ—†λ‹€λ©΄ 그것을 μ°ΎκΈ° μœ„ν•΄ 더 μƒμœ„μ˜ ν”„λ‘œν† νƒ€μž…(λΆ€λͺ¨)μ—μ„œ μ°ΎμŠ΅λ‹ˆλ‹€. 이것을 ν”„λ‘œν† νƒ€μž… 체인이라고 ν•©λ‹ˆλ‹€.
ν”„λ‘œν† νƒ€μž… 체인의 μ΅œμƒμœ„μ— μœ„μΉ˜ν•˜λŠ” κ°μ²΄λŠ” μ–Έμ œλ‚˜ Object.prototypeμž…λ‹ˆλ‹€. 체인의 쒅점인 Object.prototype μ—μ„œλ„ ν”„λ‘œνΌν‹°λ₯Ό 검색할 수 없을 경우 undefinedλ₯Ό λ°˜ν™˜ ν•œλ‹€κ³  ν•©λ‹ˆλ‹€.

μš”μ•½ 정리

  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”„λ‘œν† νƒ€μž… 기반 μ–Έμ–΄μž…λ‹ˆλ‹€.
  • ν”„λ‘œν† νƒ€μž…μ€ μ›ν˜•(μœ μ „μž)μ΄λΌλŠ” λœ»μž…λ‹ˆλ‹€. (객체의 μ›ν˜•, 즉 객체의 λΆ€λͺ¨κ°€ κ°€μ§€λŠ” μœ μ „μž 즉, 상속받은 데이터, λ©”μ†Œλ“œ)
  • ν•¨μˆ˜ κ°μ²΄μ—λŠ” ν”„λ‘œν† νƒ€μž…μ΄λΌλŠ” νŠΉμˆ˜ν•œ μœ ν˜•μ˜ 객체 ν”„λ‘œνΌν‹°(속성)κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. (객체와 ν”„λ‘œνΌν‹°κ°€ 같은 μ˜λ―Έκ°€ μ•„λ‹ˆλ‹€.)
  • μ΄λŸ¬ν•œ prototype ν”„λ‘œνΌν‹°λ₯Ό 톡해 μƒμ„±μž ν•¨μˆ˜λŠ” μΈμŠ€ν„΄μŠ€μ—κ²Œ ν”„λ‘œν† νƒ€μž… 객체에 μžˆλŠ” 데이터, λ©”μ†Œλ“œλ₯Ό μƒμ†ν•©λ‹ˆλ‹€. (μΈμŠ€ν„΄μŠ€λŠ” μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.)
  • μΈμŠ€ν„΄μŠ€ 객체의 key에 μ ‘κ·Όν•  λ•Œ, ν•΄λ‹Ή κ°μ²΄μ—κ²Œ keyκ°€ μ—†λ‹€λ©΄ κ·Έ λ‹€μŒμœΌλ‘œ μƒμœ„ ν”„λ‘œν† νƒ€μž…(μ›ν˜•) μ†μ„±μ—μ„œ keyκ°€ μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
  • μ—†λ‹€λ©΄ 그것을 μ°ΎκΈ° μœ„ν•΄ 더 μƒμœ„μ˜ ν”„λ‘œν† νƒ€μž…(λΆ€λͺ¨)μ—μ„œ μ°ΎμŠ΅λ‹ˆλ‹€. 이것을 ν”„λ‘œν† νƒ€μž… 체인이라고 ν•©λ‹ˆλ‹€.
profile
β˜„οΈ

0개의 λŒ“κΈ€