[JavaScript] Prototype Chain

Hannahhhยท2022๋…„ 7์›” 22์ผ
0

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
30/47

๐Ÿ” Prototype Chain

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํŠน์„ฑ ์ค‘ ์ƒ์†์„ JavaScript์—์„œ ๊ตฌํ˜„ํ•  ๋•Œ, prototype chain ์‚ฌ์šฉํ•œ๋‹ค.

๋ชจ๋“  ๊ฐ์ฒด๋“ค์€ ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ๋“ค์„ ์ƒ์† ๋ฐ›๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๊ทธ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด ๋˜ํ•œ ์ƒ์œ„ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์ƒ์†์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , ๊ทธ ์ƒ์œ„ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค. ์ด๋ฅผ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ์„ ํ•œ ๊ฐ์ฒด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. -MDN



๐Ÿ‘€ ์˜ˆ์‹œ

ํ•™์ƒ(Student)๊ณผ ์‚ฌ๋žŒ(Human)์ด๋ผ๋Š” class๊ฐ€ ๊ฐ๊ฐ ์กด์žฌํ•œ๋‹ค๊ณ  ์‚ฌ์ •ํ•ด๋ณด์ž.

Human class์˜ ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ์„ ๊ฐ์ฒด๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

let kimcoding = new Human('๊น€์ฝ”๋”ฉ', 30);

// ์†์„ฑ
kimcoding.age;
kimcoding.gender;
// ๋ฉ”์„œ๋“œ
kimcoding.eat();
kimcoding.sleep();

ํ•™์ƒ์€ ์‚ฌ๋žŒ์ด๊ธฐ ๋•Œ๋ฌธ์—, Student class๋Š” Human class์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
์ผ๋ฐ˜์ ์ธ ์‚ฌ๋žŒ์˜ ํŠน์ง• ์™ธ์˜ ํ•™์ƒ์— ์ ํ•ฉํ•œ ํŠน์ง•์„ ํ•„์š”๋กœ ํ•œ๋‹ค. => ์ƒ์†๋ฐ›์€ ๋ฉ”์„œ๋“œ(์‚ฌ๋žŒ์˜ ํŠน์ง•) + ์ถ”๊ฐ€ ๋ฉ”์„œ๋“œ(ํ•™์ƒ์— ์ ํ•ฉํ•œ ํŠน์ง•)

Student class์˜ ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ์„ ๊ฐ์ฒด๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

let parkhacker = new Student('๋ฐ•ํ•ด์ปค', 22);

// ์†์„ฑ
parkhacker.grade;
// ๋ฉ”์„œ๋“œ
parkhacker.learn();

์œ„์˜ ์˜ˆ์‹œ์— ๋”ฐ๋ฅด๋ฉด, parhacker๋Š” Student์ด๋ฉฐ, ์‚ฌ๋žŒ์ด๊ธฐ ๋•Œ๋ฌธ์— Human class์˜ ์†์„ฑ(age, gender)๊ณผ ๋ฉ”์„œ๋“œ( sleep( ), eat( ) )์„ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.



โญ JavaScript์—์„œ๋Š” extends์™€ super ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์ƒ์†์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.


โœ” extends์™€ super ํ‚ค์›Œ๋“œ๋กœ ์ƒ์† ๊ตฌํ˜„


์•„๋ž˜๋Š” ์œ„์˜ ์˜ˆ์‹œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์žฌ์ž‘์„ฑ๋œ Human class ์ฝ”๋“œ์ด๋‹ค.
class Human{
  constructor(age, gender){
    this.age = age;
    this.gender = gender;
  }
  sleep(){
    console.log(`${this.age}์„ธ ${this.gender} A์”จ๋Š” ์ž ์„ ์žก๋‹ˆ๋‹ค.`);
  };
  eat(){
    console.log(`${this.age}์„ธ ${this.gender} A์”จ๋Š” ๋ฐฅ์„ ๋จน์Šต๋‹ˆ๋‹ค.`);
  };
}

์œ„์—์„œ ์‚ฌ๋žŒ์„ ๋‚˜ํƒ€๋‚ด๋Š” Human class๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ , ํ•ด๋‹น class๋Š” ์ผ๋ฐ˜์ ์ธ ์‚ฌ๋žŒ์ด ๊ฐ€์ง€๋Š” ํŠน์ง•๋“ค์„ ๋‚˜์—ดํ•˜๊ณ  ์žˆ๋‹ค.

์•„๋ž˜๋Š” Human class๋ฅผ ์ƒ์†๋ฐ›์€ Student class์˜ ์ฝ”๋“œ์ด๋‹ค. ์ด ์ž‘์—…์„ ํ•˜์œ„ ํด๋ž˜์Šค ์ƒ์„ฑ์ด๋ผ๊ณ  ํ•œ๋‹ค.

class Student extends Human{ //extends
  constructor(age, gender, subject, grade){
  super(age, gender); //super
    // ์ถ”๊ฐ€๋œ ์†์„ฑ(ํ•™์ƒ์˜ ํŠน์ง•)
    this.subject = subject;
    this.grade = grade;
  }
  // ์ถ”๊ฐ€๋œ ์†์„ฑ
  learn(){
    console.log(`${this.age}์„ธ ${this.gender} A์”จ๋Š” ${this.subject}์„(๋ฅผ) ๊ณต๋ถ€ํ•ฉ๋‹ˆ๋‹ค.`);
  }
  test(){
    console.log(`${this.subject}์˜ ํ‰์ ์€ ${this.grade} ์ž…๋‹ˆ๋‹ค.`)
  }
}

Student class์˜ instance๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, Student์™€ Human ์–‘ ์ชฝ์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
let kim = new Student( 20,'์—ฌ์„ฑ','๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ','B+');

kim.sleep(); // '20์„ธ ์—ฌ์„ฑ A์”จ๋Š” ์ž ์„ ์žก๋‹ˆ๋‹ค.'
kim.eat(); // '20์„ธ ์—ฌ์„ฑ A์”จ๋Š” ๋ฐฅ์„ ๋จน์Šต๋‹ˆ๋‹ค.'
kim.learn(); // '20์„ธ ์—ฌ์„ฑ A์”จ๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„(๋ฅผ) ๊ณต๋ถ€ํ•ฉ๋‹ˆ๋‹ค.'
kim.test(); // '๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ‰์ ์€ B+ ์ž…๋‹ˆ๋‹ค.'

๊ฐ™์€ ์†์„ฑ์„ ๊ฐ€์กŒ์„ ๋•Œ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ฎ์–ด ์”Œ์›Œ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด์—์„œ super๋Š” this ํ‚ค์›Œ๋“œ๊ฐ€ ๋‚˜์˜ค๊ธฐ ์ „์— ์‚ฌ์šฉ๋ผ์•ผ ํ•œ๋‹ค.




โœ” __proto__ ์†์„ฑ์œผ๋กœ ์ƒ์† ํ™•์ธ

DOM ๊ณผ ํ”„๋กœํ† ํƒ€์ž…

๋ธŒ๋ผ์šฐ์ €์—์„œ DOM์„ ์ด์šฉํ•˜๋ฉด document.creaElement('div')๋กœ ์ƒˆ๋กœ์šด div element๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ div element๋Š” HTMLEivElement๋ผ๋Š” class์˜ instance์ด๋‹ค.

DOM element๋Š” innerHTML๊ณผ ๊ฐ™์€ ์†์„ฑ๋“ค๊ณผ append()์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋“ค์ด ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ, ๊ฐ๊ฐ์˜ element๊ฐ€ ์†์„ฑ, ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฏ€๋กœ, Element๋ผ๋Š” ๊ณตํ†ต์˜ ๋ถ€๋ชจ๊ฐ€ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

ํ™”์‚ดํ‘œ ๋ฐฉํ–ฅ์€ ๋ถ€๋ชจ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ, EvenTarget์˜ ๋ถ€๋ชจ๋กœ๋Š” ๋ชจ๋“  class์˜ ์กฐ์ƒ์ธ Object๊ฐ€ ์žˆ๋‹ค.


์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด `div` element๋ฅผ ์‹œ์ž‘์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ๊ณผ์ •์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
let div = document.createElement('div');

div.__proto__ // HTMLDivElement {โ€ฆ}
div.__proto__.__proto__ // HTMLElement {โ€ฆ}
div.__proto__.__proto__.__proto__ // Element {โ€ฆ}
div.__proto__.__proto__.__proto__.__proto__ // Node {โ€ฆ}
div.__proto__.__proto__.__proto__.__proto__.__proto__ // EventTarget {โ€ฆ}
div.__proto__.__proto__.__proto__.__proto__.__proto__.__proto__ // {โ€ฆ} <- object
div.__proto__.__proto__.__proto__.__proto__.__proto__.__proto__.__proto__ // null





Reference:
์ฝ”์Šค ์Šคํ…Œ์ด์ธ 
MDN: https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/Object_prototypes

0๊ฐœ์˜ ๋Œ“๊ธ€