ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Prototype - AIπŸ€–
    JavaScript 2023. 7. 15. 13:02

    ν”„λ‘œν† νƒ€μž…(Prototype)은 JavaScript의 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ€‘μš”ν•œ κ°œλ…μœΌλ‘œ, 객체듀 κ°„μ˜ 상속과 ν”„λ‘œν† νƒ€μž… 체이닝을 κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€. ν”„λ‘œν† νƒ€μž…μ€ λͺ¨λ“  JavaScript 객체가 가지고 μžˆλŠ” μ†μ„±μœΌλ‘œ, ν•΄λ‹Ή 객체의 λΆ€λͺ¨ 역할을 ν•˜λŠ” 객체λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.

    1. ν”„λ‘œν† νƒ€μž… 체인 (Prototype Chain):
      • JavaScript의 객체듀은 ν”„λ‘œν† νƒ€μž…κ³Ό μ—°κ²°λœ 링크 ꡬ쑰λ₯Ό κ°€μ§‘λ‹ˆλ‹€.
      • 객체의 속성 λ˜λŠ” λ©”μ„œλ“œλ₯Ό 찾을 λ•Œ ν•΄λ‹Ή 객체의 ν”„λ‘œν† νƒ€μž…μ—λ„ μ—†λ‹€λ©΄, κ·Έ ν”„λ‘œν† νƒ€μž…μ˜ ν”„λ‘œν† νƒ€μž…μ„ κ³„μ†ν•΄μ„œ νƒμƒ‰ν•˜λŠ” 과정을 λ§ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ μ—¬λŸ¬ λ‹¨κ³„μ˜ ν”„λ‘œν† νƒ€μž…μ΄ μ—°κ²°λœ ꡬ쑰가 ν”„λ‘œν† νƒ€μž… μ²΄μΈμž…λ‹ˆλ‹€.
    2. μƒμ„±μž ν•¨μˆ˜ (Constructor Function):
      • 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” ν•¨μˆ˜λ₯Ό λ§ν•©λ‹ˆλ‹€.
      • new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν˜ΈμΆœν•˜λ©΄ ν•΄λ‹Ή μƒμ„±μž ν•¨μˆ˜λ‘œλΆ€ν„° μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ©λ‹ˆλ‹€.
    3. ν”„λ‘œν† νƒ€μž… 속성:
      • λͺ¨λ“  ν•¨μˆ˜ κ°μ²΄λŠ” prototype 속성을 가지며, 이 속성은 ν•΄λ‹Ή ν•¨μˆ˜λ‘œλΆ€ν„° μƒμ„±λœ μΈμŠ€ν„΄μŠ€μ˜ μ›ν˜•(ν”„λ‘œν† νƒ€μž… 객체)을 κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
      • **prototype**에 μΆ”κ°€λœ λ©”μ„œλ“œμ™€ 속성은 ν•΄λ‹Ή μƒμ„±μž ν•¨μˆ˜λ‘œλΆ€ν„° μƒμ„±λœ λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ—μ„œ κ³΅μœ λ©λ‹ˆλ‹€.
    4. μ˜΅μ…”λ„ 체이닝 (Optional Chaining):
      • ES11(ES2020)μ—μ„œ λ„μž…λœ λ¬Έλ²•μœΌλ‘œ, μ€‘μ²©λœ 객체의 속성에 μ•ˆμ „ν•˜κ²Œ μ ‘κ·Όν•˜κΈ° μœ„ν•œ κΈ°λŠ₯μž…λ‹ˆλ‹€.
      • ?. μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 객체의 μ€‘μ²©λœ 속성을 ν™•μΈν•˜κ³ , ν•΄λ‹Ή 속성이 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ μ—λŸ¬λ₯Ό λ°©μ§€ν•˜κ³  **undefined**λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    μ˜ˆμ‹œ:

    // μƒμ„±μž ν•¨μˆ˜
    function Person(name) {
      this.name = name;
    }
    
    // Person의 prototype에 λ©”μ„œλ“œ μΆ”κ°€
    Person.**prototype**.sayHello = function() {
      console.log(`Hello, my name is ${this.name}.`);
    };
    
    // 객체 생성
    const **person1** = new Person('Alice');
    const **person2** = new Person('Bob');
    
    // κ°μ²΄μ—μ„œ λ©”μ„œλ“œ 호좜
    **person1.sayHello()**; // 좜λ ₯: "Hello, my name is Alice."
    **person2.sayHello();** // 좜λ ₯: "Hello, my name is Bob."
    
    

    이 μ˜ˆμ‹œμ—μ„œ **Person.prototype.sayHello**λŠ” Person μƒμ„±μž ν•¨μˆ˜μ˜ ν”„λ‘œν† νƒ€μž…μ— λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜κ³ , 이 λ©”μ„œλ“œλŠ” Person μƒμ„±μžλ‘œλΆ€ν„° μƒμ„±λœ λͺ¨λ“  객체듀이 κ³΅ν†΅μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν”„λ‘œν† νƒ€μž…μ„ μ‚¬μš©ν•˜μ—¬ μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ„ 높이고 λ©”λͺ¨λ¦¬ νš¨μœ¨μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

    ν”„λ‘œν† νƒ€μž…μ€ JavaScript의 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 핡심적인 κ°œλ…μ΄λ―€λ‘œ, 잘 μ΄ν•΄ν•˜κ³  ν™œμš©ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. ν”„λ‘œν† νƒ€μž…κ³Ό ν”„λ‘œν† νƒ€μž… 체인을 μ΄ν•΄ν•˜λ©΄ JavaScript μ½”λ“œλ₯Ό λ”μš± 효율적으둜 μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    prototype을 μ‚¬μš©ν•˜μ§€ μ•Šμ€ 경우

    Person 객체 μžμ²΄μ— sayHello λ©”μ„œλ“œλ₯Ό 직접 μΆ”κ°€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λ ‡κ²Œ μ •μ˜λœ λ©”μ„œλ“œλŠ” μƒμ„±μž ν•¨μˆ˜(Person)μ—λ§Œ 직접 호좜이 κ°€λŠ₯ν•˜κ³ , ν•΄λ‹Ή μƒμ„±μžλ‘œ μƒμ„±λœ μΈμŠ€ν„΄μŠ€μ—μ„œλŠ” 직접 ν˜ΈμΆœν•  수 μ—†μŠ΅λ‹ˆλ‹€.

    function Person(name) {
      this.name = name;
    }
    
    Person.sayHello = function() {
      console.log('Hello!');
    };
    
    **//직접 호좜**
    Person.sayHello(); // 좜λ ₯: "Hello! (Person object)" (Person.sayHello() 호좜)
    

    Prototype을 μ‚¬μš© ν•˜λ©΄ Person의 λͺ¨λ“  μΈμŠ€ν„΄μŠ€(person1, person2)μ—μ„œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜μ§€λ§Œ,

    객체 μžμ²΄μ— λ©”μ†Œλ“œλ₯Ό 직접 μΆ”κ°€ν•œ 이와 같은 방식은 직접 호좜만 κ°€λŠ₯ν•΄ μž¬μ‚¬μš©μ΄ λΆˆκ°€λŠ₯해진닀.

    'JavaScript' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

    ES5 VS ES6 VS ES6+ 차이 - AIπŸ€–  (0) 2023.07.15
Designed by Tistory.