๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํน์ฑ ์ค ์์์ 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
ํค์๋๋ฅผ ์ด์ฉํด์ ์์์ ๊ตฌํํ ์ ์๋ค.
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๋ฅผ ์์๋ฐ์ 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} ์
๋๋ค.`)
}
}
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์ ์ด์ฉํ๋ฉด document.creaElement('div')
๋ก ์๋ก์ด div
element๋ฅผ ๋ง๋ค ์ ์๋ค. ์ด๋ ๊ฒ ์์ฑ๋ div
element๋ HTMLEivElement๋ผ๋ class์ instance์ด๋ค.
DOM element๋ innerHTML๊ณผ ๊ฐ์ ์์ฑ๋ค๊ณผ append()์ ๊ฐ์ ๋ฉ์๋๋ค์ด ์๋ค.
๋ฐ๋ผ์, ๊ฐ๊ฐ์ element๊ฐ ์์ฑ, ๋ฉ์๋๊ฐ ์กด์ฌํ๋ฏ๋ก, Element๋ผ๋ ๊ณตํต์ ๋ถ๋ชจ๊ฐ ์์์ ์ ์ ์๋ค.
ํ์ดํ ๋ฐฉํฅ์ ๋ถ๋ชจ๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐ, EvenTarget์ ๋ถ๋ชจ๋ก๋ ๋ชจ๋ class์ ์กฐ์์ธ Object๊ฐ ์๋ค.
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