πŸ“Œ 18μž₯ ν•¨μˆ˜μ™€ 일급 객체

경이·2022λ…„ 3μ›” 8일
0


πŸ”₯ 18.1 일급 객체

μ•„λž˜μ™€ 같은 쑰건을 λ§Œμ‘±ν•˜λŠ” 객체λ₯Ό 일급객체 라고 ν•œλ‹€.

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

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

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

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

ν•¨μˆ˜ 객체의 arguments ν”„λ‘œνΌν‹°μ˜ 값은 arguments 객체이닀.

argement κ°μ²΄λŠ” ν•¨μˆ˜ ν˜ΈμΆœμ‹œ μ „λ‹¬λœ μΈμˆ˜λ“€μ˜ 정보λ₯Ό λ‹΄κ³  μžˆλŠ” 순회 κ°€λŠ₯ν•œ μœ μ‚¬ λ°°μ—΄ 객체이며, ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 지역 λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©λœλ‹€. 즉 ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œλŠ” μ°Έμ‘°ν•  수 μ—†λ‹€.

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

  console.log(multiply());        // NaN
  console.log(multiply(1));       // NaN
  console.log(multiply(1, 2));    // 2
  console.log(multiply(1, 2, 3)); // 2

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

  function sum() {
    let res = 0;

    // arguments κ°μ²΄λŠ” length ν”„λ‘œνΌν‹°κ°€ μžˆλŠ” μœ μ‚¬ λ°°μ—΄ κ°μ²΄μ΄λ―€λ‘œ for 문으둜 μˆœνšŒν•  수 μžˆλ‹€.
    for (let i = 0; i < arguments.length; i++) {
      res += arguments[i];
    }

    return res;
  }

  console.log(sum());        // 0
  console.log(sum(1, 2));    // 3
  console.log(sum(1, 2, 3)); // 6

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

ν•¨μˆ˜ 객체의 caller ν”„λ‘œνΌν‹°λŠ” ν•¨μˆ˜ μžμ‹ μ„ ν˜ΈμΆœν•œ ν•¨μˆ˜λ₯Ό 가리킨닀.

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

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

  // λΈŒλΌμš°μ €μ—μ„œμ˜ μ‹€ν–‰ν•œ κ²°κ³Ό
  console.log(foo(bar)); // caller : function foo(func) {...}
  console.log(bar());    // caller : null

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

ν•¨μˆ˜ 객체의 length ν”„λ‘œνΌν‹°λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ μ„ μ–Έν•œ λ§€κ°œλ³€μˆ˜μ˜ 개수λ₯Ό 가리킨닀.

arguments 객체의 length ν”„λ‘œνΌν‹°λŠ” 인자의 개수λ₯Ό 가리킀고, ν•¨μˆ˜ 객체의 lengthλŠ” λ§€κ°œλ³€μˆ˜μ˜ 개수λ₯Ό κ°€λ¦¬ν‚€λ―€λ‘œ μ£Όμ˜ν•œλ‹€.

  function foo() {}
  console.log(foo.length); // 0

  function bar(x) {
    return x;
  }
  console.log(bar.length); // 1

  function baz(x, y) {
    return x * y;
  }
  console.log(baz.length); // 2

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

ν•¨μˆ˜ 객체의 name ν”„λ‘œνΌν‹°λŠ” ν•¨μˆ˜ 이름을 λ‚˜νƒ€λ‚Έλ‹€.

  // κΈ°λͺ… ν•¨μˆ˜ ν‘œν˜„μ‹
  var namedFunc = function foo() {};
  console.log(namedFunc.name); // foo

  // 읡λͺ… ν•¨μˆ˜ ν‘œν˜„μ‹
  var anonymousFunc = function() {};
  // ES5: name ν”„λ‘œνΌν‹°λŠ” 빈 λ¬Έμžμ—΄μ„ κ°’μœΌλ‘œ κ°–λŠ”λ‹€.
  // ES6: name ν”„λ‘œνΌν‹°λŠ” ν•¨μˆ˜ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” λ³€μˆ˜ 이름을 κ°’μœΌλ‘œ κ°–λŠ”λ‹€.
  console.log(anonymousFunc.name); // anonymousFunc

  // ν•¨μˆ˜ μ„ μ–Έλ¬Έ(Function declaration)
  function bar() {}
  console.log(bar.name); // bar

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

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

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

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

profile
μ΄μ‚¬μ€‘μž…λ‹ˆλ‹€!🌟https://velog.io/@devkyoung2

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보