ν•¨μˆ˜μ˜ μ•”μ‹œμ  νŒŒλΌλ―Έν„° - this #2

μ•”μ‹œμ  νŒŒλΌλ―Έν„°μΈ this에 λŒ€ν•΄μ„œ μ•Œμ•„λ΄…λ‹ˆλ‹€.

Sep 27, 2021

κΉ€ν˜„κΈ°

#JS

ν•¨μˆ˜μ˜ μ•”μ‹œμ  νŒŒλΌλ―Έν„°λŠ” 4편으둜 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

  1. arguments
  2. this-1
  3. this-2
  4. this-3

λ“€μ–΄κ°€λ©°

이번 ν¬μŠ€νŒ…μ—μ„œλŠ” 이전μž₯에 μ΄μ–΄μ„œ μƒμ„±μžλ₯Ό ν†΅ν•œ ν˜ΈμΆœμ„ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

  1. ν•¨μˆ˜λ‘œμ„œ 호좜
  2. λ©”μ„œλ“œλ‘œμ„œ 호좜
  3. μƒμ„±μžλ‘œμ„œ 호좜
  4. call 및 applyλ₯Ό ν†΅ν•œ 호좜

μƒμ„±μž ν•¨μˆ˜

일반적으둜 μƒμ„±μž ν•¨μˆ˜λŠ” 일반 ν•¨μˆ˜μ™€ 기술적인 μ°¨μ΄λŠ” μ—†κ³  μ•„λž˜ 두 κ΄€λ‘€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.

1. ν•¨μˆ˜ μ΄λ¦„μ˜ 첫 κΈ€μžλŠ” λŒ€λ¬Έμžλ‘œ μ‹œμž‘ν•©λ‹ˆλ‹€.

2. λ°˜λ“œμ‹œ β€˜new’ μ—°μ‚°μžλ₯Ό λΆ™μ—¬ μ‹€ν–‰ν•©λ‹ˆλ‹€.

μ€μ˜ μ„ μž„λ‹˜μ΄ 9μ›” ν¬μŠ€νŒ…μ—μ„œ μƒμ„±μž ν•¨μˆ˜μ— λŒ€ν•΄μ„œ μ„€λͺ…ν•΄ μ£Όμ…¨λŠ”λ°μš”.

μ œκ°€ 더 μ‚΄νŽ΄λ³Ό 점은 new μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜μ—¬ μƒμ„±μž ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œμ˜ thisκ°€ 무엇을 λ°˜ν™˜ν• κΉŒ? μž…λ‹ˆλ‹€.

function MyFunction() {
	this.skulk = function() {
  	return this
  }
}

const my = new MyFunction()

const my2 = MyFunction()

// 첫번째 질문
console.log("my1", my.skulk() === my) 
// λ‘λ²ˆμ§Έ 질문
console.log("my2", my2.skulk() === my2) 

첫 번째 질문, 두 번째 μ§ˆλ¬Έμ—μ„œ μ–΄λ–€ κ²°κ³Όκ°€ 좜λ ₯ λ κΉŒμš”?

jsfiddleμ—μ„œ ν™•μΈν•΄μ£Όμ„Έμš”

new μ—°μ‚°μžμ˜ λ™μž‘

new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ μ•„λž˜μ™€ 같은 μ•Œκ³ λ¦¬μ¦˜μ΄ λ™μž‘ν•©λ‹ˆλ‹€.

  1. 빈 객체λ₯Ό λ§Œλ“€μ–΄ this에 ν• λ‹Ήν•©λ‹ˆλ‹€.
  2. ν•¨μˆ˜ 본문을 μ‹€ν–‰ν•©λ‹ˆλ‹€. this에 μƒˆλ‘œμš΄ ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•΄ thisλ₯Ό μˆ˜μ •ν•©λ‹ˆλ‹€.
  3. thisλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
function User(name) {
  // this = {};  (빈 객체가 μ•”μ‹œμ μœΌλ‘œ λ§Œλ“€μ–΄μ§)

  // μƒˆλ‘œμš΄ ν”„λ‘œνΌν‹°λ₯Ό this에 좔가함
  this.name = name;
  this.isAdmin = false;

  // return this;  (thisκ°€ μ•”μ‹œμ μœΌλ‘œ λ°˜ν™˜λ¨)
}

이제 첫 번째 μ§ˆλ¬Έμ— λŒ€ν•œ 닡을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

this에 ν• λ‹Ήλœ μƒˆλ‘­κ²Œ μƒμ„±λœ κ°μ²΄λŠ” new μ—°μ‚°μžμ˜ κ°’μœΌλ‘œ λ°˜ν™˜λ˜κ³  skulkλŠ” this 자기 μžμ‹ μ„ λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ— trueκ°€ λ©λ‹ˆλ‹€.

두 번째 μ§ˆλ¬Έμ€ my2λ₯Ό 생성할 λ•Œ new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœλ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이전 μž₯에 μ„€λͺ…μ²˜λŸΌ thisλŠ” μ „μ—­ 객체 windowκ°€ λ©λ‹ˆλ‹€.


console.log("my2", my2.skulk() === my2) // Cannot read properties of undefined (reading 'skulk')

console.log("my2", window.skulk() === window) // true

μƒμ„±μž ν•¨μˆ˜μ—μ„œ 자체 값을 λ°˜ν™˜ν•˜λ©΄ μ–΄λ–»κ²Œ 될까?

μœ„ new μ—°μ‚°μžμ˜ λ™μž‘μ—μ„œ this에 빈 객체가 μ•”μ‹œμ μœΌλ‘œ λ§Œλ“€μ–΄μ§€κ³  μ•”μ‹œμ μœΌλ‘œ λ°˜ν™˜λœλ‹€κ³  ν–ˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ λ‹€λ₯Έ 값을 자체적으둜 λ°˜ν™˜ν•˜λ©΄ μ–΄λ–»κ²Œ λ κΉŒμš”?

값을 λ°˜ν™˜

function MyFunction() {
	this.skulk = function() {
  	return true
  }
  return 1
}

const my = new MyFunction()

console.log(MyFunction() === 1) // ?

console.log(my.skulk() === true) // ?

κ²°κ³ΌλŠ” jsfiddleμ—μ„œ ν™•μΈν•΄μ£Όμ„Έμš”!

κ²°κ³Όλ₯Ό μ‹€ν–‰ν•΄ 보면 MyFunction ν•¨μˆ˜κ°€ 1을 λ°˜ν™˜ν•œλ‹€λŠ” 사싀은 μ½”λ“œ λ™μž‘ 방식에 큰 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

MyFunction을 ν•¨μˆ˜λ‘œ ν˜ΈμΆœν•˜λ©΄ 1을 λ¦¬ν„΄ν•©λ‹ˆλ‹€.

new μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜μ—¬ μƒμ„±μžλ‘œ ν˜ΈμΆœν•˜μ—¬λ„ 객체가 μƒμ„±λ˜κ³  skulk λ©”μ„œλ“œλŠ” μ˜¬λ°”λ₯΄κ²Œ λ°˜ν™˜λ©λ‹ˆλ‹€.

객체λ₯Ό λ°˜ν™˜

const obj = {
  skulk: 1
}

function MyFunction2() {
  this.skulk = 2
  return obj
}

const my2 = new MyFunction2()

console.log(my2 === obj)
console.log(my2.skulk === 1)

κ²°κ³ΌλŠ” jsfiddleμ—μ„œ ν™•μΈν•΄μ£Όμ„Έμš”!

객체λ₯Ό λ°˜ν™˜ν•  λ•ŒλŠ” 값을 λ°˜ν™˜ν•  λ•Œμ™€λŠ” μ’€ λ‹€λ¦…λ‹ˆλ‹€.

this에 빈 객체가 μ•”μ‹œμ μœΌλ‘œ λ§Œλ“€μ–΄μ§€κ³  λ°˜ν™˜λ˜μ–΄μ•Ό ν•˜λŠ”λ° obj 객체가 λ°˜ν™˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

이 κ²½μš°μ—λŠ” μƒμ„±μžκ°€ 객체λ₯Ό λ°˜ν™˜ν•˜λ©΄ ν•΄λ‹Ή κ°μ²΄λŠ” 전체 new μ—°μ‚°μžμ˜ μƒμ„±μž ν•¨μˆ˜λ‘œ λ°˜ν™˜λ˜κ³  this에 ν• λ‹Ήλœ 빈 κ°μ²΄λŠ” λ²„λ €μ§‘λ‹ˆλ‹€.

κ·œμΉ™

μœ„μ—μ„œ λ³΄μ…¨λ‹€μ‹œν”Ό 객체λ₯Ό λ°˜ν™˜ν•  λ•ŒλŠ” this에 ν• λ‹Ήλœ κ°μ²΄λŠ” λ¬΄μ‹œλ©λ‹ˆλ‹€.

μƒμ„±μžλ‘œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λŠ” 일반적으둜 일반 ν•¨μˆ˜μ™€ λ‹€λ₯΄κ²Œ μ½”λ”©λ˜κ³  μ‚¬μš©λ˜λ©°, μƒμ„±μžλ‘œ ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ” ν•œ κ·Έλ‹€μ§€ μœ μš©ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—

μƒμ„±μžλ₯Ό 일반 ν•¨μˆ˜ 및 λ©”μ„œλ“œμ™€ κ΅¬λ³„ν•˜κΈ° μœ„ν•΄ λͺ…λͺ… κ·œμΉ™μ΄ μƒκ²ΌμŠ΅λ‹ˆλ‹€.

  1. ν•¨μˆ˜μ™€ λ©”μ„œλ“œλŠ” 일반적으둜 ν•˜λŠ” 일을 μ„€λͺ…ν•˜λŠ” λ™μ‚¬λ‘œ μ‹œμž‘ν•˜κ³  μ†Œλ¬Έμžλ‘œ μ‹œμž‘ν•˜μ—¬ 이름이 μ§€μ–΄μ§‘λ‹ˆλ‹€.

  2. μƒμ„±μžλŠ” 일반적으둜 User, Employee, Personκ³Ό 같이 λŒ€λ¬Έμžλ‘œ μ‹œμž‘ν•˜μ—¬ μƒμ„±λ˜λŠ” 객체λ₯Ό μ„€λͺ…ν•˜λŠ” λͺ…μ‚¬λ‘œ λ§Œλ“€κ²Œ λ©λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ™œ κ·Έ λͺ¨μ–‘μΌκΉŒ?

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ™œ κ·Έ λͺ¨μ–‘μΌκΉŒλž€ μ±… 1μž₯ μ΄λ¦„μ—μ„œλŠ” μ΄λ ‡κ²Œ μ–˜κΈ°ν•©λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  이름은 λ°˜λ“œμ‹œ μ†Œλ¬Έμžλ‘œ μ‹œμž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ new μ—°μ‚°μž 문제 λ•Œλ¬Έμž…λ‹ˆλ‹€. ν•¨μˆ˜ 호좜문이 new둜 μ‹œμž‘ν•˜λ©΄ ν•΄λ‹Ή ν•¨μˆ˜λŠ” μƒμ„±μžλ‘œμ„œ 호좜되고, κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœλ©λ‹ˆλ‹€. μƒμ„±μžμ™€ ν•¨μˆ˜μ˜ κΈ°λŠ₯은 μƒλ‹Ήνžˆ λ‹€λ¦…λ‹ˆλ‹€. μƒμ„±μžλ₯Ό 잘λͺ»λœ λ°©μ‹μœΌλ‘œ ν˜ΈμΆœν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 더 ν—·κ°ˆλ¦¬λŠ” 점은 μƒμ„±μžμ™€ ν•¨μˆ˜λŠ” κ²‰μœΌλ‘œλŠ” μ™„μ „νžˆ λ˜‘κ°™μ•„ λ³΄μΈλ‹€λŠ” μ μž…λ‹ˆλ‹€. κ·Έλž˜μ„œ newλ₯Ό 써야 ν•˜λŠ”λ° μ“°μ§€ μ•Šμ€ 경우, ν˜Ήμ€ λ°˜λŒ€λ‘œ 잘λͺ» μ‚¬μš©ν•œ new둜 인해 λ°œμƒν•˜λŠ” 문제λ₯Ό μžλ™μœΌλ‘œ 감지할 방법이 μ—†μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ ν•œ κ°€μ§€ 약속을 ν–ˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“  μƒμ„±μž ν•¨μˆ˜μ˜ 이름은 λŒ€λ¬Έμžλ‘œ μ‹œμž‘λ˜μ–΄μ•Ό ν•˜λ©°, κ·Έλ ‡μ§€ μ•Šμ€ 경우 λͺ¨λ“  κ²½μš°λŠ” μ†Œλ¬Έμžλ‘œ μ‹œμž‘λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. κ·Έλ ‡κ²Œ ν•΄μ„œ μ—λŸ¬λ₯Ό 쀄일 수 μžˆλŠ” μ‹œκ°μ μ€ ν‘œμ‹œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μ €μž λ”κΈ€λŸ¬μŠ€ ν¬λ½ν¬λ“œ(JSON을 λ§Œλ“  λΆ„μž…λ‹ˆλ‹€.)κ°€ μ œμ‹œν•˜λŠ” 방법 쀑 ν•˜λ‚˜λŠ” μ ˆλŒ€ newλ₯Ό μ‚¬μš©ν•˜μ§€ 말아라 μž…λ‹ˆλ‹€. newλ₯Ό μ“°μ§€ μ•ŠμœΌλ©΄ λŒ€λ¬Έμžλ‘œ μ‹œμž‘ν•˜λŠ” 이름을 쓸일 도 μ—†λ‹€κ³  ν•©λ‹ˆλ‹€.

μ• μ΄ˆμ— ν—·κ°ˆλ¦¬μ§€ μ•Šκ²Œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 편이 μ’‹λ‹€.λΌλŠ” μ •λ„λ‘œλ§Œ 짚고 λ„˜μ–΄κ°€λ©΄ 쒋을 λ“―ν•©λ‹ˆλ‹€. (이 μ„Έμƒμ—λŠ” λ‹€μ–‘ν•œ 의견이 μ‘΄μž¬ν•˜κ³  λ§Žμ΄λ“€ μ‹Έμš°μ§€μš”. νƒ­ vs μŠ€νŽ˜μ΄μŠ€λ°”μ²˜λŸΌ)

κ°œμΈμ μœΌλ‘œλŠ” Classμ—μ„œ μ‚¬μš©λ˜λŠ” new 문법은 μƒμ„±μž ν•¨μˆ˜μ˜ new와 μ’€ λ‹€λ₯΄μ§€ μ•Šλ‚˜ μƒκ°λ˜μ§€λ§Œ ES6λ₯Ό μ‚¬μš©ν•  수 μ—†λŠ” ν™˜κ²½μ—μ„œ Class 없이 μž¬μ‚¬μš© 객체λ₯Ό λ§Œλ“€λ €λ©΄ 직접 λ§Œλ“€μ–΄λ„ λ©λ‹ˆλ‹€.(μ€μ˜ μ„ μž„λ‹˜ 예제λ₯Ό μ’€ κ°€μ Έμ™”μŠ΅λ‹ˆλ‹€.)

function user(who, when, what) {
  const _who = who;
  const _when = when;
  const _what = what;
  
  function printAll() {
  	return `${_when} ${_who} ${_what}`;
  }
  
  return Object.freeze({
  	who: _who,
    when: _when,
    what: _what,
  	printAll
  })
}

// μƒˆλ‘œμš΄ 객체 생성
let user1 = user('woman', 2021, 'studying');
let user2 = user("man", 2020, "hello")

console.log(user1);
console.log(user2);

마치며

이번 ν¬μŠ€νŒ…μ—μ„œλŠ”

  1. μƒμ„±μžλ‘œμ„œ 호좜

에 λŒ€ν•΄ μ•Œμ•„λ΄€μŠ΅λ‹ˆλ‹€.

λ‹€μŒ ν¬μŠ€νŒ…μ—μ„œλŠ” call 및 applyλ₯Ό ν†΅ν•œ ν˜ΈμΆœμ„ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

μ°Έκ³ λ¬Έμ„œ

Grow & Glow Β© 2025

Banner images by undraw.co