front-end/JavaScript

[JavaScript] 21. ν΄λ‘œμ €

gaan 2023. 5. 15. 05:08

πŸ“– λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ ꡐ재 24μž₯. ν΄λ‘œμ €

 

MDNμ—μ„œ μ •μ˜ν•˜λŠ” ν΄λ‘œμ €λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

ν΄λ‘œμ €λŠ” ν•¨μˆ˜μ™€ κ·Έ ν•¨μˆ˜κ°€ μ„ μ–Έλœ λ ‰μ‹œμ»¬ ν™˜κ²½κ³Όμ˜ 쑰합이닀.

01. λ ‰μ‹œμ»¬ μŠ€μ½”ν”„

ν΄λ‘œμ €λ₯Ό μ΄ν•΄ν•˜λ €λ©΄ λ¨Όμ € λ ‰μ‹œμ»¬ ν™˜κ²½, 즉 λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λ₯Ό 이해해야 ν•œλ‹€.

 

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•¨μˆ˜κ°€ μ •μ˜λœ μœ„μΉ˜μ— 따라 μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€.
이λ₯Ό λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(정적 μŠ€μ½”ν”„)라고 ν•œλ‹€.

 

그리고 객체가 μƒμ„±λ˜λŠ” μ‹œμ μ— μƒμœ„ μŠ€μ½”ν”„κ°€ κ²°μ •λœλ‹€.

➑️ [[Envirnment]] λ‚΄λΆ€ μŠ¬λ‘―μ— μ €μž₯

 

이후 ν•¨μˆ˜κ°€ 호좜되고 ν•¨μˆ˜ λͺΈμ²΄ μ½”λ“œκ°€ ν‰κ°€λ˜λŠ” μ‹œμ μ— μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ 참쑰에

객체가 μƒμ„±λ λ•Œ μ €μž₯ν•œ μƒμœ„ μŠ€μ½”ν”„μ— λŒ€ν•œ 참쑰값을 μ €μž₯ν•œλ‹€.


02. ν•¨μˆ˜ 객체의 λ‚΄λΆ€ 슬둯 [[Environment]]

λ ‰μ‹œμ»¬ μŠ€μ½”ν”„κ°€ κ°€λŠ₯ν•˜λ €λ©΄ ν•¨μˆ˜λŠ” μƒμœ„ μŠ€μ½”ν”„λ₯Ό κΈ°μ–΅ν•΄μ•Όν•œλ‹€.
(μƒμœ„  μŠ€μ½”ν”„λŠ” ν•¨μˆ˜ μ •μ˜κ°€ μœ„μΉ˜ν•˜λŠ” μŠ€μ½”ν”„μ΄λ‹€.)

 

이λ₯Ό μœ„ν•΄ ν•¨μˆ˜λŠ” ν•¨μˆ˜ μ •μ˜κ°€ ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체λ₯Ό 생성할 λ•Œ,
μžμ‹ μ΄ μ •μ˜λœ ν™˜κ²½(μœ„μΉ˜)에 μ˜ν•΄ κ²°μ •λœ μƒμœ„ μŠ€μ½”ν”„μ˜ μ°Έμ‘°λ₯Ό

ν•¨μˆ˜ 객체 μžμ‹ μ˜ λ‚΄λΆ€ 슬둯 [[Envirnment]]에 μ €μž₯ν•œλ‹€.

➑️ [[Environment]] λ‚΄λΆ€ μŠ¬λ‘―μ— μ €μž₯된 μƒμœ„ μŠ€μ½”ν”„μ˜ μ°Έμ‘°λŠ” ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ 가리킨닀.

 

➑️ ν•¨μˆ˜ 객체의 [[Environment]] λ‚΄λΆ€ μŠ¬λ‘―μ— μ €μž₯된 μƒμœ„ μŠ€μ½”ν”„λŠ” μžμ‹ μ΄ ν˜ΈμΆœλ˜μ—ˆμ„ λ•Œ 생성될 ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ 참쑰에 μ €μž₯될 참쑰값이닀.

 

πŸ–₯️ μ˜ˆμ‹œ μ½”λ“œ 24-04

const x = 1;

function foo() {
  const x = 10;
  
  bar();
}

// ν•¨μˆ˜ barλŠ” μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ [[Environment]]에 μ €μž₯ν•˜μ—¬ κΈ°μ–΅ν•œλ‹€.
function bar() {
  console.log(x);
}

foo(); // 1
bar(); // 10

➑️ 그림의 β‘  - μ „μ—­ μ½”λ“œ 평가 μ‹œμ μ—μ„œ foo와 barν•¨μˆ˜ 객체가 μƒμ„±λ˜λ©°, 각 ν•¨μˆ˜ 객체의 λ‚΄λΆ€ 슬둯 [[Environment]]에 μƒμœ„ μŠ€μ½”ν”„κ°€ μ €μž₯됨.

 

➑️ fooν•¨μˆ˜κ°€ 호좜되면, β‘‘ fooν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ μƒμ„±λ˜λ©°, μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½ ν™˜κ²½μ— λŒ€ν•œ 참쑰에 μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ μ°Έμ‘°(ν•¨μˆ˜ 객체의 λ‚΄λΆ€ 슬둯 [[Environment]]에 μ €μž₯된)κ°€ μ €μž₯λœλ‹€.

 

➑️ barν•¨μˆ˜κ°€ 호좜되면 β‘’ barν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ μƒμ„±λ˜λ©°, μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½ ν™˜κ²½μ— λŒ€ν•œ 참쑰에 μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ μ°Έμ‘°(ν•¨μˆ˜ 객체의 λ‚΄λΆ€ 슬둯 [[Environment]]에 μ €μž₯된)κ°€ μ €μž₯λœλ‹€.

 


03. ν΄λ‘œμ €μ™€ λ ‰μ‹œμ»¬ ν™˜κ²½

πŸ’‘ μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 쀑첩 ν•¨μˆ˜κ°€ 더 였래 μœ μ§€λ˜λŠ” 경우, 쀑첩 ν•¨μˆ˜λŠ” 이미 생λͺ… μ£ΌκΈ°κ°€ μ’…λ£Œλœ μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό μ°Έμ‘° κ°€λŠ₯ν•˜λ‹€.

➑️ μ΄λŸ¬ν•œ 쀑첩 ν•¨μˆ˜λ₯Ό ν΄λ‘œμ €(closure)라고 λΆ€λ₯Έλ‹€.

 

πŸ–₯️ 예제 μ½”λ“œ 24-05

const x = 1;

// β‘ 
function outer() {
  const x = 10;
  const inner = function () { console.log(x); }; // β‘‘
  return inner;
}

// outer ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ 쀑첩 ν•¨μˆ˜ innerλ₯Ό λ°˜ν™˜ν•œλ‹€.
// 그리고 outer ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ νŒλ˜μ–΄ μ œκ±°λœλ‹€.
const innerFunc = outer(); // β‘’
innerFunc(); // β‘£ 10

β‘’μ—μ„œ outerν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ outerν•¨μˆ˜λŠ” 쀑첩 ν•¨μˆ˜innerλ₯Ό λ°˜ν™˜(return)ν•˜κ³  생λͺ… μ£ΌκΈ°λ₯Ό λ§ˆκ°ν•œλ‹€.

➑️ 즉, outerν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ μ œκ±°λœλ‹€.
➑️ μ΄λ•Œ outerν•¨μˆ˜μ˜ μ§€μ—­ λ³€μˆ˜ x λ˜ν•œ 생λͺ… μ£ΌκΈ°λ₯Ό λ§ˆκ°ν•œλ‹€.

 

❓ κ·ΈλŸ¬λ‚˜ β‘£μ—μ„œ innerν•¨μˆ˜ 호좜 κ²°κ³ΌλŠ” outerν•¨μˆ˜μ˜ μ§€μ—­ λ³€μˆ˜ x의 값인 10이닀.

이미 생λͺ… μ£ΌκΈ°κ°€ μ’…λ£Œλ˜μ–΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ 제거된 outerν•¨μˆ˜μ˜ μ§€μ—­ λ³€μˆ˜ xκ°€ λ‹€μ‹œ λ™μž‘ν•œλ‹€.

 

<μœ„ μ½”λ“œ μ‹€ν–‰ μˆœμ„œ>

1. μ „μ—­ μ½”λ“œ μ‹€ν–‰ (outer 객체 생성)

2. outer ν•¨μˆ˜ 호좜 (inner 객체 생성 및 λ°˜ν™˜)

3. innerFunc μ „μ—­ λ³€μˆ˜μ— inner ν•¨μˆ˜ μ°Έμ‘° ν• λ‹Ή

4. innerFunc호좜둜 inner ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½ 생성 (innerν•¨μˆ˜ 객체의 [[Environment]] λ‚΄λΆ€ 슬둯 μ°Έμ‘°)

 

⚠️ 2λ²ˆμ—μ„œ outerν•¨μˆ˜ 호좜되고 outerν•¨μˆ˜μ˜ 싀행이 μ’…λ£Œλ˜μ–΄ outerν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ μ œκ±°λ˜μ—ˆμ§€λ§Œ, outerν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½κΉŒμ§€ μ†Œλ©Έν•˜λŠ” 것은 μ•„λ‹ˆλ‹€. 

➑️ κ°€λΉ„μ§€ μ»¬λ ‰ν„°λŠ” μ°Έμ‘°ν•˜κ³  μžˆλŠ” λ©”λͺ¨λ¦¬ 곡간을 ν•΄μ œν•˜μ§€ μ•ŠλŠ”λ°, outer ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ€ 참쑰되고 있기 λ•Œλ¬Έ.

 

πŸ’‘ ν΄λ‘œμ €λŠ” 쀑첩 ν•¨μˆ˜κ°€ μƒμœ„ μŠ€μ½”ν”„μ˜ μ‹λ³„μžλ₯Ό μ°Έμ‘°ν•˜κ³  있고 쀑첩 ν•¨μˆ˜κ°€ μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 더 였래 μœ μ§€λ˜λŠ” κ²½μš°μ— ν•œμ •ν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€.


04. ν΄λ‘œμ €μ˜ ν™œμš©

πŸ’‘ ν΄λ‘œμ €λŠ” μƒνƒœ(state)λ₯Ό μ•ˆμ „ν•˜κ²Œ λ³€κ²½ν•˜κ³  μœ μ§€ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.

➑️ μƒνƒœλ₯Ό μ•ˆμ „ν•˜κ²Œ 은닉(information hiding)ν•˜κ³  νŠΉμ • ν•¨μˆ˜μ—κ²Œλ§Œ μƒνƒœ 변경을 ν—ˆμš©ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.


πŸ–₯️ 예제 μ½”λ“œ 24-09 (num λ³€μˆ˜μ˜ 값을 μ „μ—­ λ³€μˆ˜λ‘œ 관리)

// 카운트 μƒνƒœ λ³€μˆ˜
let num = 0;

// 카운트 μƒνƒœ λ³€κ²½ ν•¨μˆ˜
const increase = function () {
  // 카운트 μƒνƒœλ₯Ό 1만큼 증가 μ‹œν‚¨λ‹€.
  return ++num;
};

console.log(increase()); // 1
console.log(increase()); // 2
console.log(increase()); // 3

⚠️  μœ„ μ½”λ“œλŠ” 였λ₯˜μ˜ κ°€λŠ₯성이 μžˆμ–΄ μ’‹μ§€ μ•Šμ€ μ½”λ“œλ‹€. 

➑️ num μ „μ—­ λ³€μˆ˜μ— μ–Έμ œλ“ μ§€ λˆ„κ΅¬λ‚˜ μ ‘κ·Όν•˜μ—¬ 변경이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.


πŸ–₯️ 예제 μ½”λ“œ 24-10 (num λ³€μˆ˜μ˜ 값을 ν•¨μˆ˜μ˜ μ§€μ—­ λ³€μˆ˜λ‘œ 관리)

// 카운트 μƒνƒœ λ³€κ²½ ν•¨μˆ˜
const increase = function () {
  // 카운트 μƒνƒœ λ³€μˆ˜
  let num = 0;

  // 카운트 μƒνƒœλ₯Ό 1만큼 증가 μ‹œν‚¨λ‹€.
  return ++num;
};

// 이전 μƒνƒœλ₯Ό μœ μ§€ν•˜μ§€ λͺ»ν•œλ‹€.
console.log(increase()); // 1
console.log(increase()); // 1
console.log(increase()); // 1

⚠️ ν•¨μˆ˜κ°€ 호좜될 λ•Œλ§ˆλ‹€ μ§€μ—­ λ³€μˆ˜num은 λ‹€μ‹œ μ„ μ–Έλ˜μ–΄ 0으둜 μ΄ˆκΈ°ν™”λ˜κΈ° λ•Œλ¬Έμ— μƒνƒœλ₯Ό μœ μ§€ν•˜μ§€ λͺ»ν•œλ‹€.


πŸ–₯️ μ˜ˆμ œ μ½”λ“œ 24-11 (ν΄λ‘œμ € ν™œμš©)

// 카운트 μƒνƒœ λ³€κ²½ ν•¨μˆ˜
const increase = (function () {
  // 카운트 μƒνƒœ λ³€μˆ˜
  let num = 0;

  // ν΄λ‘œμ €
  return function () {
    // 카운트 μƒνƒœλ₯Ό 1만큼 증가 μ‹œν‚¨λ‹€.
    return ++num;
  };
}());

console.log(increase()); // 1
console.log(increase()); // 2
console.log(increase()); // 3

➑️ μ½”λ“œ μ„€λͺ…

⭐ ν΄λ‘œμ €λ‘œ num의 μƒνƒœ(state)λ₯Ό μ€λ‹‰ν•˜μ—¬ μ˜λ„μΉ˜ μ•Šκ²Œ λ³€κ²½λ˜μ§€ μ•Šλ„λ‘ μ•ˆμ „ν•˜κ²Œ κ΄€λ¦¬ν•˜κ³ ,

νŠΉμ • ν•¨μˆ˜μ—κ²Œλ§Œ μƒνƒœ 변경을 ν—ˆμš©ν•˜μ—¬ μƒνƒœλ₯Ό μ•ˆμ „ν•˜κ²Œ λ³€κ²½ν•˜κ³  μœ μ§€ν•œλ‹€.


* πŸ–₯️ 예제 μ½”λ“œ 24-12 (ν΄λ‘œμ € - κ°μ†Œ κΈ°λŠ₯ μΆ”κ°€)

const counter = (function () {
  // 카운트 μƒνƒœ λ³€μˆ˜
  let num = 0;

  // ν΄λ‘œμ €μΈ λ©”μ„œλ“œλ₯Ό κ°–λŠ” 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.
  // 객체 λ¦¬ν„°λŸ΄μ€ μŠ€μ½”ν”„λ₯Ό λ§Œλ“€μ§€ μ•ŠλŠ”λ‹€.
  // λ”°λΌμ„œ μ•„λž˜ λ©”μ„œλ“œλ“€μ˜ μƒμœ„ μŠ€μ½”ν”„λŠ” μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄λ‹€.
  return {
    // num: 0, // ν”„λ‘œνΌν‹°λŠ” publicν•˜λ―€λ‘œ μ€λ‹‰λ˜μ§€ μ•ŠλŠ”λ‹€.
    increase() {
      return ++num;
    },
    decrease() {
      return num > 0 ? --num : 0;
    }
  };
}());

console.log(counter.increase()); // 1
console.log(counter.increase()); // 2

console.log(counter.decrease()); // 1
console.log(counter.decrease()); // 0

 

* πŸ–₯️ 예제 μ½”λ“œ 24-13 (ν΄λ‘œμ € - μƒμ„±μž ν•¨μˆ˜λ‘œ ν‘œν˜„)

const Counter = (function () {
  // β‘  카운트 μƒνƒœ λ³€μˆ˜
  let num = 0;

  function Counter() {
    // this.num = 0; // β‘‘ ν”„λ‘œνΌν‹°λŠ” publicν•˜λ―€λ‘œ μ€λ‹‰λ˜μ§€ μ•ŠλŠ”λ‹€.
  }

  Counter.prototype.increase = function () {
    return ++num;
  };

  Counter.prototype.decrease = function () {
    return num > 0 ? --num : 0;
  };

  return Counter;
}());

const counter = new Counter();

console.log(counter.increase()); // 1
console.log(counter.increase()); // 2

console.log(counter.decrease()); // 1
console.log(counter.decrease()); // 0

(μœ„ 예제 μ½”λ“œ 24-12, 24-13 μ—μ„œ)increase, decrease λ©”μ„œλ“œλŠ” ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œμ΄λ‹€.
이 λ©”μ„œλ“œλ“€μ΄ ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체가 생성될 λ•Œ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ΄λ‹€.

λ”°λΌμ„œ increase, decreaseλ©”μ„œλ“œλŠ” μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ κΈ°μ–΅ν•˜λŠ” ν΄λ‘œμ € 이닀.

 

⭐ λ‹€μ‹œ λ§ν•˜λ©΄ numλ³€μˆ˜μ˜ 값은 increase와 decreaseλ©”μ„œλ“œλ§Œμ΄ λ³€κ²½ν•  수 μžˆλ‹€.

 


05. μΊ‘μŠν™”μ™€ 정보 은닉

πŸ’‘ μΊ‘μŠν™”(encapsulation) :  κ°μ²΄μ˜ μƒνƒœ(state)λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν”„λ‘œνΌν‹°μ™€ ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•˜κ³  μ‘°μž‘ν•  수 μžˆλŠ” λ™μž‘μΈ λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜λ‘œ λ¬ΆλŠ” 것

πŸ’‘ 정보 은닉(information hiding) : μΊ‘μŠν™”κ°€ 객체의 νŠΉμ • ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œλ₯Ό 감좜 λͺ©μ μœΌλ‘œ μ‚¬μš©ν•  λ•Œλ₯Ό 말함.

 

⚠️ λŒ€λΆ€λΆ„μ˜ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λŠ” public, private, protected와 같은 μ ‘κ·Ό μ œν•œμž(access modifier)λ₯Ό μ œκ³΅ν•˜μ§€λ§Œ,

⚠️ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€. 즉 λͺ¨λ“  ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλŠ” public이닀. -> 외뢀에 κ³΅κ°œλ˜μ–΄ μžˆλ‹€.

 

πŸ–₯️ μ˜ˆμ œ μ½”λ“œ 24-16 (μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ—μ„œ μ§€μ—­ λ³€μˆ˜ μ°Έμ‘°)

function Person(name, age) {
  this.name = name; // public
  let _age = age;   // private

  // μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ
  this.sayHi = function () {
    console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
  };
}

const me = new Person('Lee', 20);
me.sayHi(); // Hi! My name is Lee. I am 20.
console.log(me.name); // Lee
console.log(me._age); // undefined

const you = new Person('Kim', 30);
you.sayHi(); // Hi! My name is Kim. I am 30.
console.log(you.name); // Kim
console.log(you._age); // undefined

➑️ _age λ³€μˆ˜ : Person μƒμ„±μž ν•¨μˆ˜μ˜ μ§€μ—­ λ³€μˆ˜

-> private 함


πŸ–₯️ μ˜ˆμ œ μ½”λ“œ 24-17 (-> sayHi λ©”μ„œλ“œμ˜ 쀑볡 생성을 λ°©μ§€ν•˜κΈ° μœ„ν•΄, sayHi λ©”μ„œλ“œλ₯Ό ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλ‘œ λ³€κ²½)

function Person(name, age) {
  this.name = name; // public
  let _age = age;   // private
}

// ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ
Person.prototype.sayHi = function () {
  // Person μƒμ„±μž ν•¨μˆ˜μ˜ μ§€μ—­ λ³€μˆ˜ _ageλ₯Ό μ°Έμ‘°ν•  수 μ—†λ‹€
  console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
};

⚠️ ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ(Person.prototype.sayHi λ©”μ„œλ“œ) λ‚΄μ—μ„œλŠ” Person μƒμ„±μž ν•¨μˆ˜μ˜ μ§€μ—­ λ³€μˆ˜μΈ _ageλ₯Ό μ°Έμ‘°ν•  수 μ—†λ‹€.


πŸ–₯️ μ˜ˆμ œ μ½”λ“œ 24-18 (ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλ₯Ό ν΄λ‘œμ €λ‘œ ν™œμš©)

const Person = (function () {
  let _age = 0; // private

  // μƒμ„±μž ν•¨μˆ˜
  function Person(name, age) {
    this.name = name; // public
    _age = age;
  }

  // ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ
  Person.prototype.sayHi = function () {
    console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
  };

  // μƒμ„±μž ν•¨μˆ˜λ₯Ό λ°˜ν™˜
  return Person;
}());

const me = new Person('Lee', 20);
me.sayHi(); // Hi! My name is Lee. I am 20.
console.log(me.name); // Lee
console.log(me._age); // undefined

const you = new Person('Kim', 30);
you.sayHi(); // Hi! My name is Kim. I am 30.
console.log(you.name); // Kim
console.log(you._age); // undefined

➑️ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λ‘œ κ°μ‹Έμ„œ κ·Έ μ•ˆμ— μ§€μ—­ λ³€μˆ˜ _ageλ₯Ό μ„ μ–Έν•˜κ³ ,  Personμƒμ„±μž ν•¨μˆ˜μ™€ Person.protytpe.sayHiλ©”μ„œλ“œ(ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ)λ₯Ό μ„ μ–Έν•˜κ³  Personμƒμ„±μž ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ ν•œλ‹€.

➑️ κ·Έλ ‡κ²Œλ˜λ©΄ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λŠ” μ’…λ£Œλ˜μ—ˆμ§€λ§Œ λ°˜ν™˜λœ Personμƒμ„±μž ν•¨μˆ˜μ™€ sayHiλ©”μ„œλ“œλŠ” μ—¬μ „νžˆ μ§€μ—­ λ³€μˆ˜_ageλ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” ν΄λ‘œμ €μ΄λ‹€.


* πŸ–₯️ 예제 μ½”λ“œ 24-19

⚠️ Personμƒμ„±μž ν•¨μˆ˜κ°€ μ—¬λŸ¬ 개의 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 경우, _ageλ³€μˆ˜μ˜ μƒνƒœκ°€ μœ μ§€λ˜μ§€ μ•ŠλŠ”λ‹€.

const me = new Person('Lee', 20);
me.sayHi(); // Hi! My name is Lee. I am 20.

const you = new Person('Kim', 30);
you.sayHi(); // Hi! My name is Kim. I am 30.

// _age λ³€μˆ˜ 값이 λ³€κ²½λœλ‹€!
me.sayHi(); // Hi! My name is Lee. I am 30.

06. 자주 λ°œμƒν•˜λŠ” μ‹€μˆ˜

⚠️ for문을 μ‚¬μš©ν•  λ•Œ forλ¬Έ 내뢀에 ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 경우 κΈ°λŒ€ν•˜μ§€ μ•Šμ€ κ²°κ³Όκ°€ λ‚˜νƒ€λ‚œλ‹€.

 

πŸ–₯️ μ˜ˆμ œ μ½”λ“œ 24-20

var funcs = [];

for (var i = 0; i < 3; i++) {
  funcs[i] = function () { return i; }; // β‘ 
}

for (var j = 0; j < funcs.length; j++) {
  console.log(funcs[j]()); // β‘‘
}

⚠️ 0 1 2κ°€ 좜λ ₯될 것을 κΈ°λŒ€ν•˜μ˜€μ§€λ§Œ 3 3 3이 좜λ ₯λœλ‹€.
➑️ μ΄μœ λŠ” var둜 μ„ μ–Έλœ iλ³€μˆ˜λŠ” μ „μ—­ λ³€μˆ˜λ‘œ μ„ μ–Έλ˜μ—ˆκΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ 선언문에 i값을 μ „λ‹¬ν•˜μ˜€λ”λΌλ„,

ν˜ΈμΆœν•˜λŠ” μ‹œμ μ—λŠ” i값이 3이기 λ•Œλ¬Έμ— 3 3 3이 좜λ ₯λœλ‹€.


πŸ–₯️ μ˜ˆμ œ μ½”λ“œ 24-21 (ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•΄ μ •μ •ν•œ μ½”λ“œ)

var funcs = [];

for (var i = 0; i < 3; i++){
  funcs[i] = (function (id) { // β‘ 
    return function () {
      return id;
    };
  }(i));
}

for (var j = 0; j < funcs.length; j++) {
  console.log(funcs[j]());
}

πŸ’‘ forλ¬Έ 내뢀에 ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λ‘œ 감싸고 i값을 전달해 주도둝 μˆ˜μ •
➑️ μ΄λ ‡κ²Œ ν•˜λ©΄ μƒˆλ‘œμš΄ ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„κ°€ λ°˜λ³΅λ¬Έμ„ λ°˜λ³΅ν•˜λ©΄μ„œ 계속 생겨 각각의 μŠ€μ½”ν”„μ— i값이 id λ§€κ°œλ³€μˆ˜μ— μ €μž₯되게 λœλ‹€.


* πŸ–₯️ 예제 μ½”λ“œ 24-22 (μœ„ μ˜ˆμ œλ³΄λ‹€ 더 κ°„λ‹¨ν•œ 방법 - let ν‚€μ›Œλ“œ μ‚¬μš©)

const funcs = [];

for (let i = 0; i < 3; i++) {
  funcs[i] = function () { return i; };
}

for (let i = 0; i < funcs.length; i++) {
  console.log(funcs[i]()); // 0 1 2

➑️ let ν‚€μ›Œλ“œλŠ” 블둝 레벨 μŠ€μ½”ν”„λ₯Ό λ”°λ₯΄κΈ° λ•Œλ¬Έμ— for문이 반볡될 λ•Œ λ§ˆλ‹€ μƒˆλ‘œμš΄ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ μƒμ„±λœλ‹€.

 

 

πŸ“– 참고자료

https://www.inflearn.com/course/%EB%AA%A8%EB%8D%98-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%94%A5%EB%8B%A4%EC%9D%B4%EB%B8%8C/dashboard