ν‹°μŠ€ν† λ¦¬ λ·°

일급 객체

일급 κ°μ²΄λž€, λ‹€μŒκ³Ό 쑰건을 λ§Œμ‘±ν•˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€.

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

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” λ‹€μŒ μ˜ˆμ œμ™€ 같이 μœ„μ˜ 쑰건을 보두 λ§Œμ‘±ν•˜λ―€λ‘œ 일급 κ°μ²΄μž…λ‹ˆλ‹€.

// 1. ν•¨μˆ˜λŠ” 무λͺ… λ¦¬ν„°λŸ΄λ‘œ 생성 κ°€λŠ₯
// 2. ν•¨μˆ˜λŠ” λ³€μˆ˜μ— μ €μž₯ν•  수 있음
// λŸ°νƒ€μž„(ν• λ‹Ή 단계)에 ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ΄ ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체가 μƒμ„±λ˜κ³  λ³€μˆ˜μ— 할당됨
const increase = function (num) {
    return ++num;
};

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

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

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

    return functoin () {
        num = aux(num);
        return num;
    };
}

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

이처럼 ν•¨μˆ˜κ°€ 일급 κ°μ²΄λΌλŠ” 것은 ν•¨μˆ˜λ₯Ό 객체와 λ™μΌν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•˜κ³ , μ΄λŠ” *ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ κ°€λŠ₯μΌ€ ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μž₯점 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

 

*ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° : https://j-su2.tistory.com/35?category=1033772 

 

[Design Pattern] OOP와 FP

OOPλž€? OOPλŠ” Object Oriented Programming의 μ•½μžλ‘œ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ λœ»ν•©λ‹ˆλ‹€. class와 object에 κΈ°λ°˜ν•œ ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„(λ””μžμΈ νŒ¨ν„΄)으둜, κ΄€λ ¨λœ 데이터끼리 λ¬Άμ–΄μ„œ classλ₯Ό ν˜•μ„±ν•˜κ³  κ·Έ μ•ˆμ—

j-su2.tistory.com

 


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

ν•¨μˆ˜λŠ” κ°μ²΄μ΄λ―€λ‘œ ν”„λ‘œνΌν‹°λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

function square(number) {
    return number * number;
}

console.dir(square);

console.dir(square)

squareν•¨μˆ˜μ˜ λͺ¨λ“  ν”„λ‘œνΌν‹°μ˜ ν”„λ‘œνΌν‹° μ–΄νŠΈλ¦¬λ·°νŠΈλŠ” Objcect.getOwnPropertyDescriptors λ©”μ„œλ“œλ‘œ 확인이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

이처럼 arguments, caller, length, name, prototype ν”„λ‘œνΌν‹°λŠ” λͺ¨λ‘ ν•¨μˆ˜ 객체의 데이터 ν”„λ‘œνΌν‹°λ‘œ, 일반 κ°μ²΄μ—λŠ” μ—†λŠ” ν•¨μˆ˜ 객체 고유 ν”„λ‘œνΌν‹°μž…λ‹ˆλ‹€.

console.log(Object.getOwnPropertyDescriptor(square, '__proto__')); // undefined

// {get: f, set: f, enumberable: false, configurable: true}
console.log(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__'));

 ν•˜μ§€λ§Œ, __proto__λŠ” μ ‘κ·Όμž ν”„λ‘œνΌν‹°μ΄λ©°, ν•¨μˆ˜ 고유 객체의 ν”„λ‘œνΌν‹°κ°€ μ•„λ‹ˆλΌ Object.prototype 객체의 μƒν”„λ‘œνΌν‹°λ₯Ό 상속받은 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. Object.prototype 객체의 ν”„λ‘œνΌν‹°λŠ” λͺ¨λ“  객체가 상속받아 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

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

ν•¨μˆ˜ 객체의 arguments ν”„λ‘œνΌν‹° 값은 arguments κ°μ²΄μž…λ‹ˆλ‹€.

  • ν•¨μˆ˜ 호좜 μ‹œ μ „λ‹¬λœ μΈμˆ˜λ“€μ˜ 정보λ₯Ό λ‹΄κ³  μžˆλŠ” 순회 κ°€λŠ₯ν•œ *μœ μ‚¬ λ°°μ—΄ 객체
  • ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 지역 λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©λ¨
  • ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œλŠ” μ°Έμ‘° X

*μœ μ‚¬ λ°°μ—΄ 객체 : length ν”„λ‘œνΌν‹°λ₯Ό 가진 객체둜 for 문으둜 μˆœνšŒν•  수 μžˆλŠ” 객체

function multiply(x, y) {
    console.log(arguments);
    return x * y;
}

console.log(multiply(1)); // NaN, arguments = [1];
console.log(multiply(1,2)); // 2, arguments = [1, 2];
console.log(multiply(1,2,3)); // 2, arguments = [1, 2, 3];

λͺ¨λ“  μΈμˆ˜λŠ” μ•”λ¬΅μ μœΌλ‘œ argumtents 객체의 ν”„λ‘œνΌν‹°λ‘œ λ³΄κ΄€λ©λ‹ˆλ‹€. arguments κ°μ²΄λŠ” 인수λ₯Ό ν”„λ‘œνΌν‹° κ°’μœΌλ‘œ μ†Œμœ ν•˜λ©° ν”„λ‘œνΌν‹° ν‚€λŠ” 인수의 μˆœμ„œλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

  • callee ν”„λ‘œνΌν‹° : ν˜ΈμΆœλ˜μ–΄ arguments 객체λ₯Ό μƒμ„±ν•œ ν•¨μˆ˜, 즉 μžμ‹ μ„ κ°€λ₯΄ν‚΄
  •  length ν”„λ‘œνΌν‹° : 인수의 개수λ₯Ό λ‚˜νƒ€λƒ„ 

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

 

 

이제 ν•¨μˆ˜ 객체의 ν”„λ‘œνΌν‹°λ“€μ— λŒ€ν•΄ μžμ„Ένžˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

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

ν•¨μˆ˜ μžμ‹ μ„ ν˜ΈμΆœν•œ ν•¨μˆ˜λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€. caller ν”„λ‘œνΌν‹°λŠ” ECMAScript 사양에 ν¬ν•¨λ˜μ§€ μ•ŠλŠ” λΉ„ν‘œμ€€ ν”„λ‘œνΌν‹°μ΄λ―€λ‘œ 참고둜만 μ•Œμ•„λ‘λ©΄ λ©λ‹ˆλ‹€.

function foo(func) {
    return func();
}

function bar(func) {
    return 'caller: ' + bar.caller;
}

// bar ν•¨μˆ˜λ₯Ό foo ν•¨μˆ˜ λ‚΄μ—μ„œ 호좜
console.log(foo(bar)); // caller : function foo(bar) { ... }
// bar ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ ν•¨μˆ˜κ°€ μ—†μŒ
console.log(bar()); // caller : null

 

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

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

function bar(x) {
    return x;
}

console.log(bar.length); // 1

arguments 객체의 length ν”„λ‘œνΌν‹°λŠ” 인자의 개수λ₯Ό κ°€λ₯΄ν‚€κ³ , ν•¨μˆ˜ κ°μ²΄λŠ” λ§€κ°œλ³€μˆ˜μ˜ 개수λ₯Ό κ°€λ₯΄ν‚΅λ‹ˆλ‹€.

 

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

ES6μ—μ„œ 정식 ν‘œμ€€μ΄ 된 ν”„λ‘œνΌν‹°λ‘œ ν•¨μˆ˜ 이름을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 

function bar() {};
console.log(bar.name); // bar

 

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

λͺ¨λ“  κ°μ²΄λŠ” 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 상속을 κ΅¬ν˜„ν•˜λŠ” ν”„λ‘œν¬νƒ€μž… 객체λ₯Ό κ°€λ₯΄ν‚€λŠ” [[Prototype]] λ‚΄λΆ€ μŠ¬λ‘―μ„ κ°€μ§‘λ‹ˆλ‹€.

μ΄λ•Œ, __proto__ ν”„λ‘œνΌν‹°λŠ” [[Prototype]] λ‚΄λΆ€ 슬둯이 κ°€λ¦¬ν‚€λŠ” ν”„λ‘œν† νƒ€μž… 객체에 μ ‘κ·Όν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μ ‘κ·Όμž ν”„λ‘œνΌν‹°μž…λ‹ˆλ‹€.

const obj = { a: 1 };

console.log(obj.__proto__ === Object.prototype); // true

console.log(obj.hasOwnProperty('a')); // true
console.log(obj.hasOwnProperty('__proto__')); // false

직접 μ ‘κ·Όν•  수 μ—†λŠ”  [[Prototype]] λ‚΄λΆ€ μŠ¬λ‘―μ„ __proto__ μ ‘κ·Όμž ν”„λ‘œνΌν‹°λ₯Ό 톡해 κ°„μ ‘μ μœΌλ‘œ ν”„λ‘œν† νƒ€μž… 객체에 μ ‘κ·Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

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

μƒμ„±μž ν•¨μˆ˜λ‘œ ν˜ΈμΆœν•  수 μžˆλŠ” ν•¨μˆ˜ 객체, 즉 constructor만이 μ†Œμœ ν•˜λŠ” ν”„λ‘œνΌν‹°μž…λ‹ˆλ‹€. 일반 객채와 μƒμ„±μž ν•¨μˆ˜λ‘œ ν˜ΈμΆœν•  수 μ—†λŠ” non-constructorμ—λŠ” prototype ν”„λ‘œνΌν‹°κ°€ μ—†μŠ΅λ‹ˆλ‹€.

(function () {}).hasOwnProperty('prototype'); // true

({}).hasOwnProperty('prototype'); // false

prototype ν”„λ‘œνΌν‹°λŠ” ν•¨μˆ˜κ°€ 객체λ₯Ό μƒμ„±ν•˜λŠ” μƒμ„±μž ν•¨μˆ˜λ‘œ 호좜될 λ•Œ μƒμ„±μž ν•¨μˆ˜κ°€ 생성할 μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œν† νƒ€μž… 객체λ₯Ό κ°€λ₯΄ν‚΅λ‹ˆλ‹€.

 

 

 

 

 

[좜처] λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive

https://wikibook.co.kr/mjs/

 

λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive: μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리

269개의 κ·Έλ¦Όκ³Ό 원리λ₯Ό νŒŒν—€μΉ˜λŠ” μ„€λͺ…μœΌλ‘œ ‘μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리’λ₯Ό μ΄ν•΄ν•˜μž! μ›ΉνŽ˜μ΄μ§€μ˜ λ‹¨μˆœν•œ 보쑰 κΈ°λŠ₯을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μ œν•œμ μΈ μš©λ„λ‘œ νƒœμ–΄λ‚œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 과도

wikibook.co.kr