πŸ“
til
  • TIL(Today I Learned)
  • javascript
    • value-number-string-boolean-null-undefined
    • primitive-reference
    • Hoisting
    • Prototypes in Javascript
    • this
    • prototype
    • μ½œλ°±ν•¨μˆ˜ (Callback function)
    • ν•¨μˆ˜μ˜ 호좜
    • 자료ꡬ쑰 new keyword
    • closure
    • Promise
    • event-loop
    • array-object
    • 객체
    • Arguments
    • higher order function
    • operators-function-control-flow
    • 객체 생성 νŒ¨ν„΄ 3κ°€μ§€
    • Javascript scopes
    • Functional Programming
    • Design Patterns
    • 데이터 νƒ€μž…
    • Object 객체
    • ν‘œμ€€ λ‚΄μž₯ 객체의 ν™•μž₯
    • μ°Έμ‘°
    • ν•¨μˆ˜
    • 상속(Inheritance)
    • this - 'this'λ₯Ό μ‚¬μš©ν•˜λŠ” ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό 'μ–΄λ–»κ²Œ' μ‹€ν–‰ν•˜λŠλƒμ— λ”°λ₯Έ 4κ°€μ§€ this μ •μ˜
    • 전역객체(Global object)
    • 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°
    • The 'new' keyword - Object Creation in JavaScript
  • javascript-api
    • Number
      • Number.MAX_VALUE
      • Number.isInteger
      • Number.NEGATIVE_INFINITY
      • Number.isNaN()
      • Number.POSITIVE_INFINITY
      • Number.parseFloat
      • Number.EPSILON
      • number.toExponential
      • Number.MAX_SAFE_INTEGER
      • Number1 - μžμ—°μˆ˜, μ •μˆ˜, 10μ§„μˆ˜, 2μ§„μˆ˜, λΆ€λ™μ†Œμˆ˜μ , μ‹€μˆ˜
      • Number.isSafeInteger()
      • Number.MIN_VALUE
      • Number.parseInt
      • Number.NaN
      • Number.isFinite()
      • Number.MIN_SAFE_INTEGER
      • toFixed
    • string.split
    • String.fromCodePoint
    • string.trimEnd
    • string.padStart
    • string.@@iterator
    • String.fromCharCode
    • string.toUpperCase
    • string.codePointAt
    • string.toLowerCase()
    • string.toString
    • string.includes
    • string.replace()
    • string.charAt
    • String.lastIndexOf
    • string.slice
    • string.search
    • string.padEnd
    • string.substring
    • string.length
    • string.trim
    • string.localeCompare
    • String.indexOf
    • string.endsWith
    • string.valueOf
    • String.raw
    • string.matchAll()
    • string.repeat
    • string.match
    • String.prototype
    • string.startsWith
    • string.charCodeAt
    • string.trimStart
    • string.concat
    • string.toLocaleUpperCase()
    • string.toLocaleLowerCase
    • String
  • learn-node
    • debugger
    • Tip
  • schema-design
    • Database Schema Design
    • Database Schema Design
  • react
    • LifeCycle
    • redux
    • Context API
    • ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ™€ 클래슀, μ–΄λ–€ 차이가 μ‘΄μž¬ν• κΉŒ?
    • Hooksκ³Ό useEffect μ‚¬μš©ν•΄ 보기
    • Route
    • async wait μ‚¬μš©ν•˜κΈ°
    • Hooks API Reference
    • context
    • npm uninstall ν•˜λŠ”λ²•
    • test λ§Œλ“€κΈ°
  • tip
    • ν΄λ¦°μ½”λ“œ
    • BxSlider둜 ν…μŠ€νŠΈ 흐λ₯΄λŠ” 효과 λ§Œλ“€κΈ°
  • javascript30
    • Event Capture, Propagation, Bubbling and Once
    • Object and Arrays - Reference VS Copy
  • typescript
    • μš°μ•„ν•œ νƒ€μž…μŠ€ν¬λ¦½νŠΈ 2λΆ€
    • The Basic Cheatsheet
    • TypeScript
    • Type Guards and Differnetiating Types
    • μš°μ•„ν•œ νƒ€μž…μŠ€ν¬λ¦½νŠΈ
    • Generics
  • git-from-the-hell
    • git
    • init-status-add-commit-log-stage-repository
    • log-diff
    • λ¨Έμ§€ ν›„ branch μ‚­μ œν•˜κΈ°
    • μ§€μ˜₯μ—μ„œ 온 Git
    • reset-revert
    • develop branch λ₯Ό pull ν•˜κ³  μ‹Άμ„λ•Œ
  • conference-and-seminar
    • λͺ¨λ˜ ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œν™˜κ²½μ˜ 이해
  • fire-base
    • Firebase .gitignore
  • vanillacoding
    • Data Structures
    • Sorting Algorithms - part 1
    • Promise
    • class
    • 04.quiz
    • 07.event-loop
    • Design Patterns
    • OOP (Object Oriented Programming)
  • etc
    • μ•Œκ³ λ¦¬μ¦˜ μ½”λ“œλ¦¬λ·°
    • 슀슀둜 κ³΅λΆ€ν•˜λŠ” 법
    • 바닐라코딩 μˆ˜κ°• ν›„κΈ°
    • async 과제 ν›„κΈ° - 비동기, 동기, ν΄λ‘œμ €, λ°°μ—΄κ³Ό 객체
    • μœ μš©ν•œ μ‚¬μ΄νŠΈ
  • algorithm
    • The Supermarket Queue
    • Find the odd int
    • The Office III - Broken Photocopier
    • Directions Reduction
    • The Office II - Boredom Score
    • Divisible Sum Pairs
    • Codewars 이용자 μ†”λ£¨μ…˜ λͺ¨μŒ
    • Shortest Word
    • find key
    • Two Sum
    • Simple Pig Latin
  • Book
    • the essence of object-orientation
      • νƒ€μž…κ³Ό 좔상화
      • 객체 지도
      • μ΄μƒν•œ λ‚˜λΌμ˜ 객체
      • 좔상화 기법
      • 05. μ±…μž„κ³Ό λ©”μ‹œμ§€
      • 07.ν•¨κ»˜ λͺ¨μœΌκΈ°
      • 04. μ—­ν• , μ±…μž„, ν˜‘λ ₯
      • ν˜‘λ ₯ν•˜λŠ” κ°μ²΄λ“€μ˜ 곡동체
  • ecma-script2015
    • Object Literal Upgrades
    • default-parameter-template-literals-arrow-functions
    • spread-operator-rest-param
    • let-const-rest-parameter-spread-operator-destructuring
  • http
    • μ›Ή λΈŒλΌμš°μ €μ— URL을 μž…λ ₯ν–ˆμ„ λ•Œ μ–΄λ–»κ²Œ μ›Ή νŽ˜μ΄μ§€κ°€ λ³΄μ—¬μ§ˆκΉŒ?
  • jest
    • toThrow(error?)
  • data-structures
    • Data Structures
  • express
    • express generator
    • CORS
  • css-flexible-box-layout
    • flex 해버렸지 뭐야
  • git
    • Git
  • mongodb
    • MongoDB
  • markdown
    • use-markdown
  • cmder
    • cmd λͺ…λ Ήμ–΄ λͺ¨μŒ
  • debug
    • trackClicksEx function error
  • npm
    • NPM TOKEN μ„€μ •ν•˜κΈ°
  • storybook
    • Storybook
  • sort
    • Sorting Algorithms - part 1
  • javascript-koans
    • Javascript Koans μ˜€λ‹΅λ…ΈνŠΈ
  • rxjs
    • Rx.js
  • dom-elements
    • HTML Element
  • redux-toolkit
    • Redux Toolkit
  • github-actions
    • GitHub Actions
  • redux-middleware
    • redux middleware
  • rest
    • rest
  • css-rendering
    • μ½”λ“œ μŠ€ν”ΌμΈ  - CSS Rendering 1회차 2/2
    • μ½”λ“œ μŠ€ν”ΌμΈ  - CSS Rendering 1회차 1/2
  • you-dont-know-js
    • νƒ€μž…
  • server
    • # shutdown local server
  • semantic-versioning
    • Semantic Versioning 2.0.0
Powered by GitBook
On this page
  • Prototype
  • Constructor
  • ν•¨μˆ˜μ™€ prototype의 관계 - λͺ¨λ“  ν•¨μˆ˜λŠ” prototype 속성이 μžˆλ‹€!
  • λ‚¨νŽΈκ³Ό μ•„λ‚΄λ‘œ λΉ„μœ ν•΄ 보자 πŸ’‘
  • Instance πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦
  • Prototype chain! πŸ‘©β€πŸ‘§
  • Dunder Proto
  • μ—„λ§ˆμ•„λΉ λ„ μ—„λ§ˆμ•„λΉ κ°€ μžˆλ‹€.
  • Foo.prototype.proto === Object.prototype;
  • Inheritance(상속)이 μ•„λ‹ˆλΌ Behavior Delegation(행동을 μœ„μž„, λŒ€λ¦¬)이닀.

Was this helpful?

  1. javascript

Prototypes in Javascript

μžλ°”μŠ€ν¬λ¦½νŠΈ μ„Έκ³„μ˜ κ°€μ‘± 관계도λ₯Ό μ•Œμ•„λ³΄κ² λ‹€. πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦ (μ˜€μž‰?)

ν‚€μ›Œλ“œλŠ”

  • prototype (μ•„λΉ )

  • constructor (μ—„λ§ˆ)

  • instance (μžμ‹)

이 될 것이닀.

Prototype

μ΄λΌλŠ” 단어가 λœ»ν•˜λŠ” μ˜λ―ΈλŠ” μ›μ΄ˆμ μΈ ν˜•νƒœ , μ›λž˜μ˜ν˜•νƒœλ₯Ό λ§ν•œλ‹€.

Constructor

μƒμ„±μžν•¨μˆ˜ new ν‚€μ›Œλ“œμ™€ ν•¨κ»˜ μ“°μ΄λŠ” ν•¨μˆ˜λ₯Ό λ§ν•œλ‹€.

you don't konw js μ±…μ—μ„œμ˜ μ •μ˜λ„ μ°Ύμ•„λ³΄μž

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μƒμ„±μžλŠ” μ•žμ— new μ—°μ‚°μžκ°€ μžˆμ„ λ•Œ ν˜ΈμΆœλ˜λŠ” 일반 ν•¨μˆ˜μ— λΆˆκ³Όν•˜λ‹€. ν΄λž˜μŠ€μ— 뢙은 것도 μ•„λ‹ˆκ³  클래슀 μΈμŠ€ν„΄μŠ€ν™” κΈ°λŠ₯도 μ—†λ‹€. 심지어 νŠΉλ³„ν•œ ν˜•νƒœμ˜ ν•¨μˆ˜λ„ μ•„λ‹ˆλ‹€. 단지 newλ₯Ό μ‚¬μš©ν•˜μ—¬ ν˜ΈμΆœν•  λ•Œ μžλ™μœΌλ‘œ λΆ™λ“€λ € μ‹€ν–‰λ˜λŠ” κ·Έμ € ν‰λ²”ν•œ ν•¨μˆ˜λ‹€.

15.7.2 Number μƒμ„±μž(ES5.1λͺ…μ„Έ) new ν‘œν˜„μ‹μ˜ μΌλΆ€λ‘œ 호좜 μ‹œ NumberλŠ” μƒμ„±μžμ΄λ©° μƒˆλ‘œ λ§Œλ“€μ–΄μ§„ 객체λ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€.

newλ₯Ό λΆ™μ—¬μ„œ 호좜 ν•  수 있고 μ΄λŠ” κ²°κ΅­ μƒμ„±μž ν˜ΈμΆœμ΄λ‚˜ 닀름없닀. μƒμ„±μž ν•¨μˆ˜κ°€ μ•„λ‹ˆλΌ ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜λŠ” 호좜이라고 ν•΄μ•Ό μ˜³λ‹€.

μ—¬κΈ°μ„œ μ£Όλͺ©ν•˜κ²Œ λ˜λŠ” ν‚€μ›Œλ“œλ“€μ΄ μžˆλ‹€. μƒˆλ‘œ λ§Œλ“€μ–΄μ§„ 객체λ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€μ™€ ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜λŠ” 호좜 이해가 잘 λ˜λŠ” ν‚€μ›Œλ“œλ‹€!

λ˜ν•œ μΆ”κ°€λ‘œ newλ₯Ό λΆ™μ—¬ μƒμ„±μž ν˜ΈμΆœμ„ ν•˜λ©΄ μ–΄λ–€ 일이 μΌμ–΄λ‚˜λŠ”μ§€ κ°„λž΅ν•˜κ²Œ μ•Œμ•„λ³΄μž.

  • μƒˆ 객체가 툭 λ§Œλ“€μ–΄μ§„λ‹€.

  • μƒˆλ‘œ μƒμ„±λœ 객체의 [[Prototype]]이 μ—°κ²°λœλ‹€.

  • μƒˆλ‘œ μƒμ„±λœ κ°μ²΄λŠ” ν•΄λ‹Ή ν•¨μˆ˜ ν˜ΈμΆœμ‹œ this둜 바인딩 λœλ‹€.

  • 이 ν•¨μˆ˜κ°€ μžμ‹ μ˜ 또 λ‹€λ₯Έ 객체λ₯Ό λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ” ν•œ new와 ν•¨κ»˜ 호좜된 ν•¨μˆ˜λŠ” μžλ™μœΌλ‘œ μƒˆλ‘œ μƒμ„±λœ 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.

new ν‚€μ›Œλ“œμ™€ ν•¨κ»˜ μ“°μ΄λŠ” ν•¨μˆ˜

  • new Array(); - μ—¬κΈ°μ„œ μƒμ„±μž ν•¨μˆ˜λŠ” Array(); 이닀.

  • new Object();

  • new Function();

νŠΉμ§•μ΄ μžˆλŠ”λ° ν•¨μˆ˜λͺ…μ˜ μ²«κΈ€μžλŠ” λŒ€λ¬Έμžλ₯Ό μ“΄λ‹€.

μš°λ¦¬κ°€ μ§€κΈˆ κΉŒμ§€ μ΄λ ‡κ²Œ μ§μ ‘μ μœΌλ‘œ μ“°μ§€ μ•Šμ•˜μ–΄λ„ μš°νšŒν•΄μ„œ μ‚¬μš©ν–ˆμ„ 것이닀.

λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ κ°μ²΄λŠ” μƒμ„±μž ν•¨μˆ˜λ₯Ό ν†΅ν•΄μ„œ λ§Œλ“€μ–΄ 진것이닀!

var arr = [];
varr arr = new Array(); // 사싀상 λ˜‘κ°™μ€ 것이닀.

λ˜ν•œ μƒμ„±μž ν•¨μˆ˜λ„ ν•¨μˆ˜μ΄κ³  -> ν•¨μˆ˜λ„ 객체이닀. κ·Έλž˜μ„œ μƒμ„±μžν•¨μˆ˜λ„ -> 객체이닀. ν•¨μˆ˜μΈλ° 객체이닀? 이것이 λ¬΄μŠ¨λœ»μ΄λƒν•˜λ©΄ μƒμ„±μž ν•¨μˆ˜κ°€ 객체의 νŠΉμ§•μ„ κ°€μ§ˆ 수 μžˆλ‹€λŠ” 것이닀. κ·Έ νŠΉμ§•μ΄ 무엇인지 μ•Œμ•„λ³΄μž.

객체의 νŠΉμ§• key와 value둜 이루어져 μžˆλ‹€. μƒμ„±μž ν•¨μˆ˜λ„ Key와 valueλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€. μƒμ„±μž ν•¨μˆ˜μΈ Array() , Object(), Function()도 key와 valueλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ Array(), Object(), Function()은 κ³΅ν†΅μ μœΌλ‘œ μ“°μ΄λŠ”κ²ƒμ΄κΈ° λ•Œλ¬Έμ— λ”°λ‘œ key와 valueλŠ” λ§Œλ“€μ§€ μ•ŠλŠ”κ²Œ μ’‹λ‹€.

λ˜ν•œ μƒμ„±μž ν•¨μˆ˜λŠ” μ›ν•˜λ©΄ μš°λ¦¬κ°€ λ§Œλ“€ 수 μžˆλ‹€. μƒμ„±μž ν•¨μˆ˜μΈμ§€μ— λŒ€ν•œ μ •ν™•ν•œ νŒλ‹¨μ€ μ“°μž„μ— 따라 λ§žλƒ μ•„λ‹ˆλƒλ‘œ λ‚˜λ‰  수 μžˆλ‹€.

이제 ν•¨μˆ˜μ™€ prototype의 관계λ₯Ό μ•Œμ•„λ³΄μž.

ν•¨μˆ˜μ™€ prototype의 관계 - λͺ¨λ“  ν•¨μˆ˜λŠ” prototype 속성이 μžˆλ‹€!

ν•¨μˆ˜λ₯Ό λ§Œλ“€λ©΄ 무쑰건 prototypeμ΄λΌλŠ” 속성이 κ»΄μžˆλ‹€.

function foo () {
    return 3;
}
//λͺ¨λ“  ν•¨μˆ˜μ—λŠ” prototypeμ΄λΌλŠ” 속성을 κ°€μ§€κ³  μžˆλ‹€!
console.log(foo.prototype); // {constructor: Ζ’} 

function Foo () {
    return 3;
}
//λͺ¨λ“  ν•¨μˆ˜μ—λŠ” prototypeμ΄λΌλŠ” 속성을 κ°€μ§€κ³  μžˆλ‹€!
console.log(Foo.prototype); // {constructor: Ζ’}

μ½˜μ†”μ— 직접 찍어본닀면 μƒμ„±μž ν•¨μˆ˜κ°€ 맞던 μ•„λ‹ˆλ˜ ν•¨μˆ˜λͺ….prototype으둜 찍어보면 ν•¨μˆ˜λŠ” prototypeμ΄λΌλŠ” 속성을 κ°€μ§€κ³  있고 κ°’μœΌλ‘œλŠ” {constructor: Ζ’}λ₯Ό 확인 ν•  수 μžˆλ‹€.

prototype에 ν•΄λ‹Ήλ˜λŠ” valueλŠ” κ°μ²΄μž„μ„ 확인 ν•  수 μžˆλ‹€.

μ˜μ‚¬ μ½”λ“œλ‘œ μ„€λͺ…ν•œλ‹€λ©΄ Foo = { prototype: {} }둜 생각할 수 μžˆλ‹€.

prototype의 value둜 {}객체λ₯Ό κ°€μ§€κ³  있으며, κ·Έ 객체듀은 μžλ™μ μœΌλ‘œ key와 valueκ°€ μ„€μ •λ˜μ–΄μ Έ μžˆλ‹€. λ˜ν•œ constructor의 valueλŠ” μžκΈ°μžμ‹  Foo()둜 μ„€μ •λ˜μ–΄ μžˆλŠ” 것을 확인 ν•  수 μžˆλ‹€.

ConstructλŠ” .prototype 속성을 κ°€μ§€κ³  .prototype은 Prototype이라고 λΆˆλ¦¬λŠ” 객체λ₯Ό κ°€μ§€κ³  μžˆλ‹€.

  • μƒμ„±μž ν•¨μˆ˜λ₯Ό λ§Œλ“€μ—ˆλ‹€!(λͺ¨λ“ ν•¨μˆ˜ λ‹€ 포함이 κ°€λŠ₯ν•˜λ‹€)

  • μƒμ„±μž ν•¨μˆ˜λŠ” μžλ™μœΌλ‘œ prototypeμ΄λΌλŠ” 속성을 κ°€μ§€κ²Œ λœλ‹€.

  • 이 prototype 속성이 κ°–κ³  μžˆλŠ” valueλŠ” μ–΄λ–€ ν•˜λ‚˜μ˜ prototypeμ΄λΌλŠ” λΆ€λ₯΄λŠ” 객체이닀.

Prototype이라고 λΆˆλ¦¬λŠ” κ°μ²΄μ—λŠ” 항상 λ°˜λ“œμ‹œ .constructλΌλŠ” 속성을 κ°€μ§„λ‹€.

console둜 ν™•μΈν•΄λ³΄μž

ObjectλΌλŠ” μƒμ„±μž ν•¨μˆ˜κ°€ μžˆλ‹€.

  • 이 ObjectλΌλŠ” μƒμ„±μž ν•¨μˆ˜μ—λŠ” .prototypeμ΄λΌλŠ” 속성을 κ°€μ§€κ³  있고 이 .prototype은 Prototypeμ΄λΌλŠ” 객체λ₯Ό κ°€μ§€κ³  μžˆλ‹€.

  • prototypeμ΄λΌλŠ” κ°μ²΄μ—λŠ” constructorλΌλŠ” 속성이 μžˆλŠ”λ° κ·Έ 속성은 μƒμ„±μžν•¨μˆ˜λ₯Ό 가리킨닀.

  • constuctor속성은 constructorλ₯Ό 가리킨닀.

  • constructλŠ” 또 prototypeμ΄λΌλŠ” 속성을 κ°€μ§„λ‹€.

μ •λ¦¬ν•˜μžλ©΄

  • ConstructorλŠ” .prototyeμ΄λΌλŠ” 속성을 κ°€μ§„λ‹€.

  • .prototype속성은 Prototypeμ΄λΌλŠ” 객체λ₯Ό κ°€μ§„λ‹€.

  • Prototypeκ°μ²΄λŠ” .constructorλΌλŠ” 속성을 κ°€μ§€κ²Œ λœλ‹€.

  • .constructorλΌλŠ” 속성은 Constructorλ₯Ό κ°€λ¦¬ν‚€κ²Œ λœλ‹€.

  • ConstructorλŠ” λ‹€μ‹œ .prototypeμ΄λΌλŠ” 속성을 κ°€μ§€κ²Œ λœλ‹€.

이둜써 Constroctor와 Prototype은 .prototypeκ³Ό .constructor 속성은 κ°€μ§€κ³  κ·Έ 속성은 prototypeμ΄λΌλŠ” 객체와 Constructorλ₯Ό 가리킀기 λ•Œλ¬Έμ— μ„œλ‘œκ°€ μ„œλ‘œλ₯Ό κ°€λ¦¬ν‚€κ²Œ λœλ‹€.

λ‚¨νŽΈκ³Ό μ•„λ‚΄λ‘œ λΉ„μœ ν•΄ 보자 πŸ’‘

constructorκ°€ λ‚¨νŽΈμ΄ 되고 prototype은 μ•„λ‚΄κ°€ λœλ‹€. κ·Έλ¦Όκ³Ό 같이 λ‚¨νŽΈκ³Ό μ•„λ‚΄λ₯Ό λΆ€λ₯΄λŠ” 방법을 λΉ¨κ°„ ν™”μ‚΄ν‘œλŒ€λ‘œ λΆ€λ₯Ό 수 μžˆλ‹€κ³  μƒκ°ν•˜λ©΄ 쒀더 쉽닀!

πŸŒŸμ‹€μ œλ‘œ μž‘μ—…μ„ ν•  λ•Œμ—” μ“°μ§„ μ•ŠλŠ”λ‹€.

Instance πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦

(ν•œκ°€μ§€μ˜) 경우

var obj = new Object();

newλ₯Ό 톡해 μƒμ„±μžν•¨μˆ˜λ₯Ό 호좜 ν•˜λ©΄ 객체λ₯Ό 리턴해쀀닀. μƒμ„±μžν•¨μˆ˜λŠ” 무쑰건 thisλ₯Ό returnν•΄μ£Όκ³  thisλŠ” 객체이닀.

new Object()λ₯Ό ν•œ 결과물을 μΈμŠ€ν„΄μŠ€λΌκ³  λΆ€λ₯Έλ‹€. 두λ‘₯

function Foo() {}
var k = new Foo();

new Foo();λΌλŠ” 것은 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“œλŠ” 것인데 이것은 Foo의 μΈμŠ€ν„΄μŠ€λΌκ³  λ§ν•œλ‹€.

var a = new Array();
var b = new Array();

var a = [];
var b = [];

console.log(a === b) // false

μœ„μ— 두쀄이 λ˜‘κ°™λ‹€κ³  말 ν•  μˆ˜μžˆλ‹€. ν•˜μ§€λ§Œ a와 bλŠ” κ°™λ‹€κ³  ν•  수 μ—†λ‹€.

λ°©κΈˆμ „ λ‚¨νŽΈκ³Ό 아내에 λΉ„μœ λ₯Ό ν•˜μ˜€λŠ”λ° instanceλŠ” λ‚¨νŽΈκ³Ό μ•„λ‚΄μ˜ 결과물이라고 μƒκ°ν•΄λ³΄μž.

var obj = new Object();
  • μ—¬κΈ°μ„œ λ‚¨νŽΈμ€? Objectκ°€ λœλ‹€.

  • μ—¬κΈ°μ„œ μ•„λ‚΄λŠ”? Object.prtotype이 λœλ‹€.

function Foo() {}

var f = new Foo();
  • fλŠ” μ• κΈ°λ‹€.

  • Fooκ°€ μ•„λΉ κ°€ λœλ‹€.

  • Foo.prtotype이 μ—„λ§ˆκ°€ λœλ‹€.

Prototype chain! πŸ‘©β€πŸ‘§

var obj = {};
  • λ‚¨νŽΈ

  • λ‚¨νŽΈμ˜ μ•„λ‚΄

  • 근데 μžμ‹μ΄? constructorλ₯Ό μ‚¬μš© ν•  수 μžˆλ‹€?

.constructorλŠ” μ—„λ§ˆ 즉 Prototype이 κ°€μ§€λŠ” 속성이 μ˜€λ‹€.

obj에겐 아무것도 ν• λ‹Ήν•˜μ§€ μ•Šμ•˜λŠ”λ° constructorλ₯Ό κ°€μ§ˆ 수 μ—†λŠ” 상황이닀.

이게 λ¬΄μŠ¨μΌμ΄λƒ???! μžμ‹μ΄ μ—„λ§ˆμ˜ 물건을 μŠ¬μ©ν•œ 상황이닀.

μžμ‹μ€ 일단 μžμ‹ μ΄ κ°€μ§€κ³  μžˆλŠ”μ§€ ν™•μΈν•œ ν›„! 체크체크 -> μ—†λ‹€λ©΄ μ—„λ§ˆκ»„ 슬쩍 ν•œλ‹€.

var obj = {};

Object.prototype.haha = 123; // μ—„λ§ˆμ—κ²Œ hahaλΌλŠ” 속성을 섀정해쀬닀.

console.log(obj.haha) // 123

objμ—κ²Œ hahaλ₯Ό λ§Œλ“€μ–΄ μ£Όμ§€ μ•Šμ•˜λŠ”λ°! hahaλ₯Ό 가짐! πŸ‘©β€πŸ‘§

μΈμŠ€ν„΄μŠ€(μžμ‹)λŠ” μžμ‹ μ΄ λ­”κ°€λ₯Ό ν•„μš”λ‘œ ν•  λ•Œ λ¨Όμ € 양심껏 μžμ‹ μ΄ κ°€μ§€κ³  μžˆλŠ”μ§€ 확인 ν•œ ν›„ μ—†λ‹€λ©΄ prototype(μ—„λ§ˆ)μ—μ„œ μ°ΎλŠ”λ‹€.

그림으둜 ν™•μΈν•œλ‹€λ©΄

Dunder Proto

proto μ΄λ ‡κ²Œ 생긴걸 Dunder Proto라고 ν•œλ‹€.

function Person (name) {
  this.name = name;
}

// Person === λ‚¨νŽΈ
// Person.prototype === λ‚¨νŽΈμ˜ μ•„λ‚΄

// 아이 생성
var kennim = new Person('ken ken');

kennim.constructor === Person;
kennim.__proto__ === Person.prototype;

λ§ˆμ§€λ§‰ 2쀄을 μžμ„Ένžˆ μ‚΄νŽ΄λ³΄μž.

kennim.constructor === Person;

kennimμ—λŠ” constructorλΌλŠ” 속성이 μ—†λ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ—„λ§ˆμΈ prototypeμ—μ„œ μ‚΄νŽ΄λ³Ό 것이고, prototype은 .constructorλΌλŠ”κ±Έ κ°€μ§€κ³  μžˆλ‹€. 이 .constructλŠ” μ•„λΉ λ₯Ό 바라본닀. μ•„λΉ λŠ” Constructorκ³  그것은 Person이기 λ•Œλ¬Έμ— trueλ‹€!

kennim.__proto__ === Person.prototype;

μ•„κΉŒ μœ„μ—μ„œ 봀듯이 Dunder protoλŠ” Prototype이 κ°€μ§„ 정보λ₯Ό κ°€μ§€κ³  μžˆμ—ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— true

var o = new Object();

o.costructor === Object();

o.constructor = function bar () {}

console.log(o.constructor === Object); // false;

o μΈμŠ€ν„΄μŠ€ μžμ‹μ΄ κ°€μ§„ constructorλ₯Ό κ°€μž₯ λ¨Όμ € μ°ΎλŠ”λ° 그것은 bar function 이기 λ•Œλ¬Έμ— falseκ°€ λœλ‹€.

  • μžμ‹μ΄ μ—„λ§ˆμ—κ²Œ μ ‘κ·Όν•˜κ³ μž ν•  λ•Œ Dunder proto둜 ν•  수 있긴 ν•˜λ‹€. ν•˜μ§€λ§Œ ν•˜λ©΄ μ•ˆλœλ‹€.

  • μ €κ±Έ μ“°μ—¬μ•Ό ν•˜λŠ” 상황은 μ½”λ“œκ°€ μ œλŒ€λ‘œ μ§œμ—¬μžˆμ§€ μ•Šλ‹€λŠ” 것이기 λ•Œλ¬Έμ— κ·Έ 였λ₯˜λ₯Ό ν•΄κ²°ν•΄μ•Όμ§€ μ ‘κ·Όν•˜λ©΄ μ•ˆλœλ‹€.

μ—„λ§ˆμ•„λΉ λ„ μ—„λ§ˆμ•„λΉ κ°€ μžˆλ‹€.

function Foo () {} // μƒμ„±μžν•¨μˆ˜ - μ•„λΉ 

console.log(Foo.prototype); // μƒμ„±μžν•¨μˆ˜.prototype - μ—„λ§ˆ

console.log(typeof Foo.prototype) // 객체닀. 객체가 μ–΄λ–»κ²Œ λ§Œλ“€μ–΄ μ§€λŠ”κ°€? new Object() μ΄λ ‡κ²Œλ‹€.

// Foo.prototype μ–˜ λ˜ν•œ λˆ„κ΅°κ°€μ˜ μžμ‹μ΄λž€ 말이닀.

Foo.prototype μ–˜μ˜ μ—„λ§ˆλŠ” λˆ„κ΅΄κΉŒ?**

Foo.prototype λ˜ν•œ 객체 instanceλ‹€. key와 valueλ₯Ό κ°€μ‘Œλ‹€. μ•„λΉ λŠ” μƒμ„±μž ν•¨μˆ˜λ‹€ Foo.prototype의 μ•„λΉ λŠ” λˆ„κ΅¬μΌκΉŒ?

μ–˜μ—κ²Œλ„ μ—„λ§ˆμ˜ 정보λ₯Ό κ°€μ§„ __proto__κ°€ μžˆλ‹€.

잠깐 Object.prototype을 ν™•μΈν•˜μž.

μ΄λŸ¬ν•œ μ΄μœ λŠ” Foo.prototype도 new Object();둜 λ§Œλ“€μ–΄μ§„ ν•˜λ‚˜μ˜ intance이기 λ•Œλ¬Έμ΄λ‹€.

Foo.prototype.proto === Object.prototype;

Foo.prototype.__proto__ === Object.prototype; // true;

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ—„λ§ˆμ˜ μ—„λ§ˆμ˜ 정보인 Foo.prototype. proto 은 Object의 아내인 Object.prototypeκ³Ό λ™μΌν•˜λ‹€λŠ” κ²°κ³Όλ₯Ό 얻을 수 μžˆλ‹€. 🀭

  • λ‚¨νŽΈμ€ Foo

  • λ‚¨νŽΈμ˜ μ•„λ‚΄λŠ” Foo.prototype

  • λ‚¨νŽΈμ˜ μ•„λ‚΄μ˜ μ—„λ§ˆμ˜ μ •λ³΄λŠ” Foo.prototype. proto 둜 μ ‘κ·Ό

  • λ‚¨νŽΈμ˜ μ•„λ‚΄μ˜ μ—„λ§ˆλŠ” μ‹€μ œ Object.prototype 이닀. μ›Œν›„ 🀧

그럼 Object의 μ•„λ‚΄μ˜ μ—„λ§ˆλŠ” λˆ„κ΅΄κΉŒ?

console.log(Object.prototype.__proto__) // null;

μ‹œμŠ€ν…œμƒ null, Object의 μ•„λ‚΄λŠ”..μ‘₯κ³Ό λ§ˆλŠ˜μ„..λ¨Ή...(..)

가쑱관계λ₯Ό μ§μ ‘ν™•μΈν•΄λ³΄μž

κ°€μ‘±κ΄€κ³„νŒŒμ•…μ΄ λλ‚˜λ‹ˆ λ‹€μ‹œ ν•œλ²ˆ ν™•μΈν•˜κ³ μž ν•˜λŠ” μš•κ΅¬κ°€ 생겼닀.

function Father() {}
var baby = new Father();

// __proto__λ₯Ό μ΄μš©ν•΄ μ—„λ§ˆμ—κ²Œ μ ‘κ·Ό
baby.__proto__ === Father.prototype; 

// μ—„λ§ˆ(prototype)κ°€ κ°€μ§„ constructorλ₯Ό μ΄μš©ν•΄ μ•„λΉ μ—κ²Œ μ ‘κ·Ό
baby.constructor === Father;

//__proto__ 둜 ν• λ¨Έλ‹ˆμ—κ²Œλ„ μ ‘κ·Ό
baby.__proto__.__proto__ === Object.prototype;

//ν• λ¨Έλ‹ˆκ°€ λ§žλŠ”κ°€?λ₯Ό μ—„λ§ˆλ‘œ 체크해보면 falseκ°€ λ‚˜μ˜¨λ‹€.
baby.__proto__ === Object.prototype;

prototype chain은 μ΅œμ’… ObjectκΉŒμ§€ μ˜¬λΌκ°„λ‹€

function Foo() {}
var f = new Foo();

Object.prototype.haha = 123;

console.log(f.haha); // 123

Inheritance(상속)이 μ•„λ‹ˆλΌ Behavior Delegation(행동을 μœ„μž„, λŒ€λ¦¬)이닀.

ν•„μš”ν•  λ•Œλ§ˆλ‹€ 뢀탁을 ν•˜λŠ”κ²ƒμ΄μ§€ 상속 λ°›μ€κ²Œ μ•„λ‹ˆλ‹€.

PreviousHoistingNextthis

Last updated 5 years ago

Was this helpful?

a λΌλŠ” instanceλ₯Ό 생성후 aλ₯Ό console에 찍어보면 {} λΉˆκ°μ²΄κ°€ 보인닀. κ·Έ μ•ˆμ„ 열어보면 Prototype(μ—„λ§ˆ)κ°€ κ°€μ§€λŠ” 속성과 값이 μžˆλ‹€! {constructior: Object} μ—„λ§ˆμ˜ 정보λ₯Ό μ €μž₯ν•΄ 놓은 것이닀.

μ—„λ§ˆμ˜ 정보가 λ‚˜μ™”λ‹€.

이 μ •λ³΄λŠ” Foo.prototype. proto 와 Object.proto와 λ˜‘κ°™λ‹€.

μ§€κΈˆ μ ‘κ·Όν•œ 상황을 그림으둜 그리게 되면 μ΄λ ‡κ²Œ λ˜λŠ” 것이닀. (이것이 λ§ˆμ§€λ§‰ 그림이길 λΉˆλ‹€...)

prtotype 확인
prtotype 객체의 constructor속성 확인
prtotype 객체의 constructor속성 확인
μƒμ„±μžν•¨μˆ˜μ™€ prototype의 관계
μƒμ„±μžν•¨μˆ˜μ™€ prototype의 관계
instance
Dunder Proto
Objec
Objec
Objec
Dunder Proto
Dunder Proto
Objec
Dunder Proto