Intro To Prototypal Inheritance JS - Lee-hyuna/33-js-concepts-kr GitHub Wiki

JSμ—μ„œ 상속

원문 - https://dev.to/danny/intro-to-prototypal-inheritance---js-9di

이 κΈ€μ—μ„œ ν”„λ‘œν† νƒ€μž… 상속에 λŒ€ν•΄ μ„€λͺ…을 ν•˜λ € ν•©λ‹ˆλ‹€.

"μ˜΅μ…˜" μ „μ œ 쑰건으둜 "ν”„λ‘œν†  νƒ€μž… μ†Œκ°œ"에 λŒ€ν•œ 이전 글을 볼수 μžˆμŠ΅λ‹ˆλ‹€.

Intro To Prototype - Js

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

상속에 λŒ€ν•΄μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 였직 ν•˜λ‚˜μ˜ κ΅¬μ‘°λ§Œμ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€. : 객체. 각 κ°μ²΄μ—λŠ” ν”„λ‘œν†  νƒ€μž…μ΄λΌκ³  ν•˜λŠ” λ‹€λ₯Έ 객체에 λŒ€ν•œ 링크λ₯Ό λ³΄μœ ν•˜λŠ” private 속성( Prototype이라고 함 )이 μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œν†  νƒ€μž… κ°μ²΄λŠ” 자체 ν”„λ‘œν†  νƒ€μž…μ„ 가지고 있으며 객체가 ν”„λ‘œν†  νƒ€μž…μœΌλ‘œ null둜 도달할 λ•ŒκΉŒμ§€ 계속 μ§„ν–‰λ©λ‹ˆλ‹€. μ •μ˜μ— λ”°λ₯΄λ©΄ μ •μ˜μ— λ”°λ₯΄λ©΄ nullμ—λŠ” ν”„λ‘œν†  νƒ€μž…μ΄ μ—†μœΌλ©°μ΄ ν”„λ‘œν†  νƒ€μž… 체인의 μ΅œμ’… 링크 μ—­ν• μ„ν•©λ‹ˆλ‹€.

JSμ—μ„œλŠ” 이 ν”„λ‘œν†  νƒ€μž… 체인 λ•Œλ¬Έμ— μƒμ†λ§Œ κ°€λŠ₯ν•©λ‹ˆλ‹€.

예제λ₯Ό λ΄…μ‹œλ‹€. 이 μ˜ˆμ œλŠ” ν”„λ‘œν†  νƒ€μž… 상속 κ°œλ…μ„ μ„€λͺ…ν•©λ‹ˆλ‹€. first, last, age의 세가지 값을 μ·¨ν•˜λŠ” Student μƒμ„±μž ν•¨μˆ˜λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

var Student = function(first,last,age){
this.name = {
first,
last
};
this.age = age;
}

μš°λ¦¬κ°€ ν•¨μˆ˜λ₯Ό 생성할 λ•Œλ§ˆλ‹€ JS엔진은 μš°λ¦¬μ—κ²Œ 두 개의 객체λ₯Ό λ§Œλ“­λ‹ˆλ‹€.

  1. ν•˜λ‚˜λŠ” ν•¨μˆ˜ 객체 자체이고
  2. ν•˜λ‚˜λŠ” ν”„λ‘œν†  νƒ€μž… 객체

μš°λ¦¬λŠ” ν”„λ‘œν†  νƒ€μž… 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” ".prototype" μ°Έμ‘° 속성을 μ‚¬μš©ν•˜μ—¬ JS엔진이 μƒμ„±ν•œ prototype 속성을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

JS엔진에 μ˜ν•΄ μƒμ„±λœ ν”„λ‘œν†  νƒ€μž… 객체에 "sayMessage"λΌλŠ” ν•¨μˆ˜λ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

var Student = function(first,last,age){
this.name = {
first,
last
};
this.age = age;
}
Student.prototype.sayMessage = function(){
return "Hello!! "+this.name.first+" "+this.name.last+" your age is "+this.age+"."
}

Student (μƒμ„±μž) ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 객체λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

var studentOne = new Student("dharani","jayakanthan","six");
studentOne.sayMessage();
//"Hello!! dharani jayakanthan your age is six."

이 μž‘λ™ 방식은 "sayMessage" ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ JS엔진은 μ²˜μŒμ— "Student" 객체λ₯Ό λ³Ό κ²ƒμž…λ‹ˆλ‹€. Student 객체에 κΈ°λŠ₯이 μ—†μœΌλ©΄ JS엔진은 ν”„λ‘œν†  νƒ€μž… κ°μ²΄μ—μ„œ "sayMessage" ν•¨μˆ˜λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€.

호좜 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 상속

이제 "Faculty"λΌλŠ” 또 λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό 생성할 κ²ƒμž…λ‹ˆλ‹€. "Student"κ³Ό λ™μΌν•œ 맀개 λ³€μˆ˜λ₯Ό λ°›μ§€λ§Œ μΆ”κ°€μ μœΌλ‘œ salaryλ₯Ό λ§€κ°œλ³€μˆ˜λ₯Ό λ°›μŠ΅λ‹ˆλ‹€.

var Faculty = function(first,last,age,salary){
Student.call(this,first,last,age);
this.salary = salary;
}

μœ„μ˜ μ½”λ“œκ°€ μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μ€ Faculty μƒμ„±μžκ°€ Student μƒμ„±μžμ™€ λ™μΌν•œ 맀개 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜κΈ°λ₯Ό μ›ν•©λ‹ˆλ‹€. λ”°λΌμ„œ "call" ν•¨μˆ˜λ₯Ό 톡해 "Student" μƒμ„±μžλ₯Ό μƒμ†ν•˜κ³  "Faculty" μƒμ„±μžκ°€ Studentλ“€λ‘œ λΆ€ν„° μƒμ†ν•˜λŠ” 맀개 λ³€μˆ˜λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€.

이 "call"ν•¨μˆ˜λŠ” 기본적으둜 λ‹€λ₯Έ κ³³μ—μ„œ μ •μ˜λœ ν•¨μˆ˜λ₯Ό 호좜 ν•  수 μžˆμ§€λ§Œ ν˜„μž¬ μ»¨ν…μŠ€νŠΈμ—μ„œλŠ” ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 첫번째 맀개 λ³€μˆ˜λŠ” ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•  λ•Œ μ‚¬μš©ν•  값을 μ§€μ •ν•˜λ©°, λ‹€λ₯Έ 맀개 λ³€μˆ˜λŠ” 호좜 될 λ•Œ ν•¨μˆ˜μ— 전달 λ˜μ–΄μ•Όν•˜λŠ” 맀개 λ³€μˆ˜μž…λ‹ˆλ‹€.

ν˜•μ‹ 맀개 λ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μžλ₯Ό 상속 ν•˜λ €λ©΄ λ™μΌν•œ "call" ν•¨μˆ˜λ‘œ μƒμ„±μžλ₯Ό μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이 μ°Έμ‘°λ₯Ό "call" 참쑰의 맀개 λ³€μˆ˜λ‘œ 제곡 ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Ex : "ConstructorWithNoParameter.call(this)".

이제 "Student" μƒμ„±μžλ₯Ό 상속 λ°›μ•˜μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ "Faculty" μƒμ„±μž ν”„λ‘œν†  νƒ€μž… 객체의 링크λ₯Ό λ³€κ²½ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. 이제 "Faculty" μƒμ„±μž ν”„λ‘œν†  νƒ€μž… κ°μ²΄μ—λŠ” μƒμ„±μž 자체λ₯Ό κ°€λ¦¬ν‚€λŠ” μƒμ„±μž μ°Έμ‘°κ°€ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μš°λ¦¬λŠ” "Student" μƒμ„±μž ν”„λ‘œν†  νƒ€μž… κ°μ²΄μ—μ„œ μƒμ„±ν•œ "sayMessage" ν•¨μˆ˜μ— μ•‘μ„ΈμŠ€ ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€.

"Faculty"κ°€ "Student" ν”„λ‘œν†  νƒ€μž… 객체λ₯Ό 상속 받도둝 ν•˜λ €λ©΄

  • μ•„λž˜μ˜ μ½”λ“œκ°€ μΆ”κ°€μ μœΌλ‘œ ν•„μš”ν•©λ‹ˆλ‹€.
Faculty.prototype = Object.create(Student.prototype);

student ν”„λ‘œν†  νƒ€μž…μ„ 상속 λ°›μ•˜μŠ΅λ‹ˆλ‹€.. κ·ΈλŸ¬λ‚˜ μ½”λ“œλ₯Ό μžμ„Ένžˆ μ‚΄νŽ΄λ³΄λ©΄ ν•œκ°€μ§€ ν•΄μ•Όν•  것이 더 μžˆμŠ΅λ‹ˆλ‹€.

  • μœ„μ—μ„œ ν•œ 것은 μƒμ†λœ "Student" ν”„λ‘œν†  νƒ€μž… κ°μ²΄μž…λ‹ˆλ‹€. "Student.prototype"μ—λŠ” "constructor"λΌλŠ” 속성이 있으며 이 속성은 "Student" μƒμ„±μž 자체λ₯Ό 가리 ν‚΅λ‹ˆλ‹€.

이λ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ 이 쀄을 μ½”λ“œμ— μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Faculty.prototype.constructor;
/*
  function(first,last,age){
  this.name = {first,last};
  this.age = age;
  }
*/
(Student.prototype.constructor === Faculty.prototype.constructor) ? true : false;
//true

이 μ°Έμ‘°λ₯Ό λ³€κ²½ν•˜κΈ° μœ„ν•΄ "Faculty.prototype.contructor"λ₯Ό "Faculty" ν•¨μˆ˜λ‘œ μ§€μ •ν•©λ‹ˆλ‹€.

이제 falseλ₯Ό λ°˜ν™˜ν•˜λŠ”μ§€ ν™•μΈν•˜λ©΄

Faculty.prototype.contructor = Faculty;
(Faculty.prototype.constructor === Student.prototype.constructor) ? true : false;
//false

이제 λͺ¨λ“  것을 정리할 수 μžˆμŠ΅λ‹ˆλ‹€.

// Student Constructor
var Student = function(first,last,age){
  this.name = {first,last};
  this.age = age;
  }
Student.prototype.message = function(){
  if(this.salary){
      return this.name.first+" "+this.name.last+" "+"is "+this.age+" years old. And earns "+this.salary;
  }
  else{
      return this.name.first+" "+this.name.last+" "+"is "+this.age+" years old";
  }
  }
var studentOne = new Student("dharani","jayakanthan","20");

// Faculty Constructor
var Faculty = function(first,last,age,salary){
  Student.call(this,first,last,age);
  this.salary = salary;
}
Faculty.prototype = Object.create(Student.prototype);
Faculty.constructor = Faculty();
var facultyOne =  new Faculty("simon","peter","70","820,000");
facultyOne.message();
// simon peter is 70 years old. And earns 820,000
studentOne.message();
// dharani jayakanthan is 20 years old

이 것은 클래슀λ₯Ό μƒμ†ν•˜λŠ” μœ μΌν•œ 방법이 μ•„λ‹™λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 상속을 보닀 μ‰½κ²Œ μˆ˜ν–‰ν•  수 μžˆλŠ” ECMAScript κΈ°λŠ₯μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ΄λŠ” λͺ¨λ“  λΈŒλΌμš°μ €μ—μ„œ 아직 λ„λ¦¬μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이 κΈ°μ‚¬μ—μ„œ λ…Όμ˜ν•œ μ½”λ“œλŠ” IE9 μ΄ν•˜ λ²„μ „κΉŒμ§€ μ§€μ›λ©λ‹ˆλ‹€.

⚠️ **GitHub.com Fallback** ⚠️