🌸18μž₯. ν•¨μˆ˜μ™€ 일급 객체

βœ…18.1 일급 객체

λ‹€μŒ 쑰건을 λ§Œμ‘±ν•˜λŠ” 객체λ₯Ό **일급 객체**라고 ν•œλ‹€.

  1. 무λͺ…μ˜ λ¦¬ν„°λŸ΄λ‘œ 생성할 수 μžˆλ‹€. β‡’ λŸ°νƒ€μž„μ— 생성이 κ°€λŠ₯ν•˜λ‹€.

  2. λ³€μˆ˜λ‚˜ 자료ꡬ쑰(객체, λ°°μ—΄ λ“±)에 μ €μž₯ν•  수 μžˆλ‹€.

  3. ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ— 전달할 수 μžˆλ‹€.

  4. ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” 일급 객체닀.

// 1. 무λͺ… λ¦¬ν„°λŸ΄λ‘œ 생성가λŠ₯
// 2. ν•¨μˆ˜λŠ” λ³€μˆ˜μ— μ €μž₯ κ°€λŠ₯
// -> λŸ°νƒ€μž„ μ‹œμ μ— ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ΄ ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체가 μƒμ„±λ˜κ³  λ³€μˆ˜μ— ν• λ‹Ήλœλ‹€.(μ •ν™•νžˆλŠ” ν•¨μˆ˜ 객체의 참쑰값이 ν• λ‹Ή λœλ‹€.)
const increase = function (num) {
    return ++num;
};
const decrease = function (num) {
    return --num;
};

// 2. ν•¨μˆ˜λŠ” 객체에 μ €μž₯ κ°€λŠ₯
const predicate = { increase, decrease };

// 3. ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜μ— 전달 κ°€λŠ₯
// 4. ν•¨μˆ˜λŠ” λ°˜ν™˜ κ°’μœΌλ‘œ μ‚¬μš© κ°€λŠ₯
function makeCounter(predicate) {
    let num = 0;

    return function () {
        num = predicate(num);
        return num;
    };
}

// 3. ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜μ—κ²Œ ν•¨μˆ˜ 전달 κ°€λŠ₯
const increaser = makeCounter(predicate.increase);
console.log(increaser()); // 1
console.log(increaser()); // 2

const decreaser = makeCounter(predicate.decrease);
console.log(decreaser()); // -1
console.log(decreaser()); // -2

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

  • 일반 객체와 같이 ν•¨μˆ˜λ₯Ό ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ— 전달할 수 있고

  • ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μœΌλ‘œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

μ΄λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.

일반 κ°μ²΄μ™€λŠ” λ‹€λ₯΄κ²Œ

  • 일반 κ°μ²΄λŠ” ν˜ΈμΆœν•  수 μ—†μ§€λ§Œ, ν•¨μˆ˜ κ°μ²΄λŠ” ν˜ΈμΆœν•  수 μžˆλ‹€.

  • ν•¨μˆ˜ κ°μ²΄λŠ” 일반 κ°μ²΄μ—λŠ” μ—†λŠ” ν•¨μˆ˜ 고유의 ν”„λ‘œνΌν‹°λ₯Ό μ†Œμœ ν•œλ‹€.

βœ…18.2 ν•¨μˆ˜ 객체의 ν”„λ‘œνΌν‹°

ν•¨μˆ˜λ„ 객체이기 λ•Œλ¬Έμ— ν”„λ‘œνΌν‹°λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

ν•¨μˆ˜μ˜ λͺ¨λ“  ν”„λ‘œνΌν‹°

  • arguments, caller, length, name, prototypeν”„λ‘œνΌν‹° : ν•¨μˆ˜ 객체의 데이터 ν”„λ‘œνΌν‹°(ν•¨μˆ˜ 객체 고유의 ν”„λ‘œνΌν‹°)

  • __proto__ :μ ‘κ·Όμž ν”„λ‘œνΌν‹°. Object.prototype 객체의 ν”„λ‘œνΌν‹°λ₯Ό 상속받은 것(λͺ¨λ“  객체 μ‚¬μš© κ°€λŠ₯)

각 ν”„λ‘œνΌν‹°μ— λŒ€ν•΄ κ°„λ‹¨ν•˜κ²Œλ§Œ μ‚΄νŽ΄λ³΄μžλ©΄,

arguments ν”„λ‘œνΌν‹°

  • κ°’ : arguments 객체(μ „λ‹¬λœ μΈμˆ˜λ“€μ˜ 정보λ₯Ό λ‹΄κ³  μžˆλŠ” 순회 κ°€λŠ₯ν•œ(iterable)μœ μ‚¬ λ°°μ—΄ 객체)

  • ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ§€μ—­λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— μ™ΈλΆ€μ—μ„œ μ°Έμ‘°ν•  수 μ—†λ‹€.

  • λ§€κ°œλ³€μˆ˜ 개수λ₯Ό ν™•μ •ν•  수 μ—†λŠ” κ°€λ³€ 인자 ν•¨μˆ˜ λ₯Ό κ΅¬ν˜„ν•  λ•Œ 유용

  • arguments κ°μ²΄λŠ” μœ μ‚¬λ°°μ—΄κ°μ²΄μ΄μ§€ λ°°μ—΄ κ·Έμžμ²΄λŠ” μ•„λ‹ˆκΈ° λ•Œλ¬Έμ—, λ°°μ—΄ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  경우 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. β‡’ ES6λΆ€ν„° Rest νŒŒλΌλ―Έν„° λ„μž…

caller ν”„λ‘œνΌν‹°

  • λΉ„ν‘œμ€€ ν”„λ‘œνΌν‹°. ν•¨μˆ˜ μžμ‹ μ„ ν˜ΈμΆœν•œ ν•¨μˆ˜λ₯Ό 가리킴

length ν”„λ‘œνΌν‹°

  • ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ μ„ μ–Έν•œ λ§€κ°œλ³€μˆ˜μ˜ 개수

name ν”„λ‘œνΌν‹°

  • ν•¨μˆ˜μ˜ 이름

  • 읡λͺ… ν•¨μˆ˜μ˜ 경우,

    • ES5 β†’ 빈 λ¬Έμžμ—΄('')

    • ES6 β†’ ν•¨μˆ˜ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” μ‹λ³„μž

__proto__ μ ‘κ·Όμž ν”„λ‘œνΌν‹°

  • ν”„λ‘œν† νƒ€μž… 객체에 μ ‘κ·Όν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μ ‘κ·Όμž ν”„λ‘œνΌν‹°λ‘œ,

  • 이 ν”„λ‘œνΌν‹°μ— 직접 μ ‘κ·Όν•  μˆ˜λŠ” μ—†κ³  간접적인 λ°©λ²•μœΌλ‘œ μ ‘κ·Ό κ°€λŠ₯

prototype ν”„λ‘œνΌν‹°

  • μƒμ„±μž ν•¨μˆ˜λ‘œ ν˜ΈμΆœν•  수 μžˆλŠ” ν•¨μˆ˜ 객체. ( constructor만이 μ†Œμœ ν•˜λŠ” ν”„λ‘œνΌν‹°)

Last updated