πŸͺ΄ μ„±μž₯일지

μ±… ν–‰λ³΅ν•œ 이기주의자(웨인 닀이어)의 λ‚΄μš©μ— μžκ·Ήλ°›μ•„ μ‹œμž‘ν•˜λŠ” μ†Œλ°•ν•œ μ„±μž₯기둝

μ‚΄μ•„μžˆλŠ” 꽃과 죽은 꽃은 μ–΄λ–»κ²Œ κ΅¬λ³„ν•˜λŠ”κ°€?
μ„±μž₯ν•˜κ³  μžˆλŠ” 것이 μ‚΄μ•„ μžˆλŠ” 것이닀.
생λͺ…μ˜ μœ μΌν•œ μ¦κ±°λŠ” μ„±μž₯이닀!

🌳 ν‚€μ›Œλ“œ μ΅œλŒ€ν•œ κ°„λ‹¨ν•˜κ²Œ 정리, 좔후에 λ³΄λ©΄μ„œ 슀슀둜 μ„€λͺ…

JavaScript 일급 객체

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” 일급 객체라고 ν•œλ‹€. 일급 κ°μ²΄λž€ λ¬΄μ—‡μΌκΉŒ?

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

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” μœ„ 쑰건을 λͺ¨λ‘ λ§Œμ‘±ν•˜λ―€λ‘œ 일급 객체이닀.
말 κ·ΈλŒ€λ‘œ ν•¨μˆ˜λ₯Ό 객체와 λ™μΌν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” μ˜λ―Έμ΄λ‹€.
λ‹€λ§Œ ν•¨μˆ˜λŠ” 호좜이 κ°€λŠ₯ν•˜κ³  일반 κ°μ²΄μ—λŠ” μ—†λŠ” ν•¨μˆ˜ 고유의 ν”„λ‘œνΌν‹°λ₯Ό μ†Œμœ ν•  수 μžˆλ‹€.

JavaScript ν”„λ‘œν† νƒ€μž…

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”„λ‘œν† νƒ€μž… 기반 언어이닀. κ·Έλž˜μ„œ ν”„λ‘œν† νƒ€μž…μ΄ μ •ν™•νžˆ 뭘까?
사전적 μ˜λ―Έλ‘œλŠ” μ›ν˜•μ˜ 의미λ₯Ό μ§€λ‹Œλ‹€. λΉ„μœ λ₯Ό ν•΄λ³΄μžλ©΄ μ–΄λ–€ 객체의 μœ μ „ 정보같은 λŠλ‚Œμ΄λ‹€.
λŒ€ν‘œμ μœΌλ‘œ μƒμ„±μž ν•¨μˆ˜μ—μ„œ μƒμ„±μžμ˜ ν”„λ‘œνΌν‹°μ΄λ©° new μ—°μ‚°μžλ₯Ό 톡해 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ—ˆμ„ λ•Œ, κ·Έ μΈμŠ€ν„΄μŠ€λŠ” μƒμ„±μžμ˜ ν”„λ‘œν† νƒ€μž…μ„ μ°Έμ‘°ν•˜λŠ” __proto__λΌλŠ” μ ‘κ·Όμž ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ”λ‹€.

var Dog = function (name, age) {
  this.name = name;
  this.age = age;
};

var hodu = new Dog('hodu', 2);

(Dog.prototype === hodu.__proto__) === Object.getPrototypeOf(hodu); // true

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄λž€? μ‹€μ„Έκ³„μ˜ 싀체(사물 ν˜Ήμ€ κ°œλ…)λ₯Ό μΈμ‹ν•˜λŠ” 철학적 사고λ₯Ό ν”„λ‘œκ·Έλž˜λ°μ— μ ‘λͺ©ν•˜λ €λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„ 강아지가 μžˆλ‹€λ©΄, κ°•μ•„μ§€λΌλŠ” κ°œλ…μ—μ„œ 각각의 강아지 κ°œμ²΄λ“€μ€ 이름, λ‚˜μ΄ λ“± λ‹€μ–‘ν•œ 속성이 μ‘΄μž¬ν•œλ‹€. 이 λ•Œ ν•„μš”ν•œ μ†μ„±λ“€λ§Œ κ°„μΆ”λ € ν‘œν˜„ν•˜λŠ” 것을 좔상화라고 ν•œλ‹€. 객체의 μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ°μ΄ν„°λŠ” ν”„λ‘œνΌν‹°, 객체의 λ™μž‘μ„ λ‚˜νƒ€λ‚΄λŠ” ν•¨μˆ˜λŠ” λ©”μ„œλ“œλΌκ³  ν•œλ‹€.

ν”„λ‘œν† νƒ€μž… 체이닝

객체의 ν”„λ‘œνΌν‹°(ν˜Ήμ€ λ©”μ„œλ“œ)에 μ ‘κ·Όν•˜λ € ν•  λ•Œ, ν•΄λ‹Ή 객체에 μ ‘κ·Όν•˜λ €λŠ” ν”„λ‘œνΌν‹°κ°€ μ—†λ‹€λ©΄ μƒμœ„μ— μžˆλŠ”(μ²΄μ΄λ‹λ˜μ–΄μžˆλŠ”) ν”„λ‘œν† νƒ€μž…μ˜ ν”„λ‘œνΌν‹°λ₯Ό 순차적으둜 κ²€μƒ‰ν•œλ‹€.
μ‹λ³„μžμ—μ„œ μŠ€μ½”ν”„ 체이닝이 μžˆμ—ˆλ‹€λ©΄, 객체의 ν”„λ‘œνΌν‹°μ—μ„  ν”„λ‘œν† νƒ€μž… 체이닝이 μžˆλ‹€κ³  μƒκ°ν•˜λ©΄ νŽΈν•˜λ‹€.
μ‹€μ œλ‘œ 이 두 체이닝은 μ„œλ‘œ ν˜‘λ ₯ν•˜λ©° μ‹λ³„μžμ™€ ν”„λ‘œνΌν‹°λ₯Ό κ²€μƒ‰ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.

ν”„λ‘œν† νƒ€μž… 체이닝을 μ΄μš©ν•˜μ—¬ μ›ν•˜λŠ” μƒμ„±μžλ₯Ό μƒμ†μ‹œμΌœμ€„ 수 μžˆλ‹€.

정적 λ©”μ„œλ“œ, ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ, μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ

// 정적 λ©”μ„œλ“œ : μƒμ„±μž 자체의 λ©”μ„œλ“œ
Object.freeze();

// ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ : μƒμ„±μžμ˜ ν”„λ‘œν† νƒ€μž…μ˜ λ©”μ„œλ“œ
Object.prototype.hasOwnProperty();

// μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ : μΈμŠ€ν„΄μŠ€κ°€ 직접 κ°–κ³  μžˆλŠ” λ©”μ„œλ“œ
var example = { a: 1, b: 2 };
example.c = 3;

JavaScript this

μ–΄λ–€ 객체의 λ©”μ„œλ“œκ°€ μžμ‹ μ΄ μ†ν•œ 객체의 ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•˜κΈ° μœ„ν•΄μ„œ μžμ‹ μ΄ μ†ν•œ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” μ‹λ³„μžκ°€ μžˆμ–΄μ•Όν•œλ‹€.
κ·Έλž˜μ„œ 생긴 게 this이닀.(객체 본인을 λ‚΄λΆ€μ—μ„œ μ°Έμ‘°ν•˜κΈ° μœ„ν•¨) 즉, thisλŠ” μžμ‹ μ΄ μ†ν•œ 객체 λ˜λŠ” μžμ‹ μ΄ 생성할 μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚€λŠ” 자기 μ°Έμ‘° λ³€μˆ˜μ΄λ‹€.

this κΈ°μ–΅ν•  ν‚€μ›Œλ“œ

  1. thisλŠ” ν•¨μˆ˜μ˜ ν˜ΈμΆœμ— 따라 λ°”μΈλ”©λ˜λ©° ν•¨μˆ˜ 호좜 방법에 따라 바인딩이 λ‹€λ₯΄κ²Œ λœλ‹€.
  2. 일반 ν•¨μˆ˜μ™€ λ©”μ„œλ“œλ‘œ ν˜ΈμΆœλ˜μ—ˆμ„ λ•Œμ˜ this 차이
  3. 기본적으둜 thisλŠ” μ „μ—­ 객체λ₯Ό μ°Έμ‘°ν•˜κ³  μžˆλ‹€λŠ” 점
  4. Function.prototype의 λ©”μ„œλ“œμΈ apply, call, bind의 곡톡점 및 차이점