κ°λ°μ νλ€ λ³΄λ©΄ κΈ°μ‘΄μ μλ κΈ°λ₯μ κ°μ Έμ μΆκ°μ μΌλ‘ νμ₯ν΄μΌ νλ κ²½μ° νμλ‘ νλ€.
μ΄λ κΈ°μ‘΄μ κΈ°λ₯μ κ°μ§ ν΄λμ€λ₯ΌλΆλͺ¨ ν΄λμ€
, μΆκ° κΈ°λ₯μ ꡬννμ¬ νμ₯λ ν΄λμ€λ₯Όμμν΄λμ€
λ‘ ν΅μΉνλ€.
β
prototype chain
ννλ‘ μ§μ ꡬν
βextends
ν€μλ μ¬μ©
βsuper
ν€μλ μ¬μ©
prototype chain
ννλ‘ μ§μ ꡬνprototype chainμ ν΅ν μλ°μ€ν¬λ¦½νΈμ μμμ΄ μ΄λ»κ² μ΄λ€μ§λμ§ νμΈν΄λ³΄μ.
function Ultra(){}
Ultra.prototype.ultraProp = true;
function Super(){}
Super.prototype = new Ultra();
function Sub(){}
Sub.prototype = new Super();
var o = new Sub();
console.log(o.ultraProp) // true
Ultra
, Super
, Sub
μΈκ°μ μμ±μκ° μ μλμ΄ μλ€.
var o = new Sub();
μλΈ κ°μ²΄(o
) λ₯Ό λ§λ€μμλ κ·Έ κ°μ²΄μ ultraProp
νλ‘νΌν°μ μ κ·Όνλ©΄ true
κ° λμ¨λ€.
νμ§λ§ μ½λλ₯Ό μ΄ν΄λ³΄λ©΄ Sub
λ ultraProp
λ₯Ό κ°κ³ μμ§ μλ€.
Sub
μ λΆλͺ¨μΈ Super
, Super
μ λΆλͺ¨μΈ Ultra
κ° κ°κ³ μλ κ°μ΄λ€.
μ¦, Ultra (μ΅μμ) > Super > Sub
Subλ Superλ₯Ό μμ
λ°κ³ , Superλ Ultraλ₯Ό μμ
λ°λ μ
μ΄λ€.
λ°λΌμ Sub
μ Ultra
νλ‘νΌν°λ‘ μ κ·Όνμλ,
μλ°μ€ν¬λ¦½νΈλ μ€ν κ³Όμ μ€μ Subμ μ μκ° μλμλ κ°μ΄λ, μλμΌλ‘ superμ κ·Έ κ°μ κ°κ³ μλμ§ νμΈνλ€.
μ΄μκ°μ΄ λΆλͺ¨ μμ±μ
λ₯Ό μμλ°κΈ° λλ¬Έμ μμ μμ±μ
μμλ μμλ°μ κ°μ μ¬μ©ν μ μκ² λλ€.
κ²°κ΅ prototype νλ‘νΌν°μ νΈμΆμ΄ μμ ν΄λμ€μμ μ°μμ μΌλ‘ μμ©νλ©΄μ μ²΄μΈ ννλ₯Ό μ΄λ£¬ κ²μ νμΈν μ μλ€.
μ΄λ₯Ό prototype chain μΌλ‘ λΆλ₯Έλ€.
const Ultra = {
ultraProp : true
};
const Super = {}
//Super.prototype = new Ultra();
Super.__proto__ = Ultra;
const Sub = {}
//Sub.prototype = new Super();
Sub.__proto__ = Super;
console.log(Sub.ultraProp) // true
λ€μκ³Ό κ°μ΄ μμμ νλ‘ν νμ
κ°μ __proto__
ν€μλλ₯Ό ν΅ν΄ μ§μ λΆλͺ¨λ₯Ό ν λΉν΄μ£Όλ λ°©λ²λ μλ€.
extends
ν€μλμ μ¬μ©
extends
ν€μλλ ν΄λμ€λ₯Ό λ€λ₯Έ ν΄λμ€μ μμμΌλ‘ λ§λ€κΈ° μν΄ class μ μΈ λλ class μμ μ¬μ©νλ€.
μμ) extends Date
class DateFormatter extends DateFormatter {
getFormattedDate() {
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
return `${this.getDate()}-${months[this.getMonth()]}-${this.getFullYear()}`;
}
}
console.log(new DateFormatter('August 19, 1975 23:15:30').getFormattedDate());
// expected output: "19-Aug-1975"
μμ ν΄λμ€(DateFormatter
) μμ extends ν€μλλ₯Ό λ§λΆμ¬ λΆλͺ¨ ν΄λμ€(DateFormatter
) λ₯Ό νμ₯νμλ€.
super
ν€μλμ μ¬μ©super ν€μλλ λΆλͺ¨ μ€λΈμ νΈμ ν¨μ(
λΆλͺ¨ μμ±μ ν¨μ
)λ₯Ό νΈμΆν λ μ¬μ©νλ€.
μμ ) super(μΈμκ°1, μΈμκ°2);
class Polygon {
constructor(height, width) {
this.name = 'Polygon';
this.height = height;
this.width = width;
}
sayName() {
console.log('Hi, I am a ', this.name + '.');
}
}
class Square extends Polygon {
constructor(length) {
this.height; // μ°Έμ‘°μ€λ₯κ° λ°μν©λλ€. superκ° λ¨Όμ νΈμΆλμ΄μΌ ν©λλ€.
// μ¬κΈ°μ, λΆλͺ¨ν΄λμ€μ μμ±μν¨μλ₯Ό νΈμΆνμ¬ λμ΄κ°μ λ겨μ€λλ€.
// Polygonμ κΈΈμ΄μ λμ΄λ₯Ό λ겨μ€λλ€.
super(length, length);
// μ°Έκ³ : νμ ν΄λμ€μμ super() ν¨μκ° λ¨Όμ νΈμΆλμ΄μΌ
// 'this' ν€μλλ₯Ό μ¬μ©ν μ μμ΅λλ€. κ·Έλ μ§ μμ κ²½μ° μ°Έμ‘°μ€λ₯κ° λ°μν©λλ€.
this.name = 'Square';
}
get area() {
return this.height * this.width;
}
set area(value) {
this.area = value;
}
}
μμ ν΄λμ€ λ΄λΆμμ λΆλͺ¨ν΄λμ€μ μμ±μν¨μλ₯Ό νΈμΆνμ¬ κ°μ λ겨μ€λ€.
( μ΄ λ superκ° λ¨Όμ νΈμΆλμ§ μμ κ²½μ° μ°Έμ‘° μ€λ₯κ° λ°μνλ€.)
λΆλͺ¨ ν΄λμ€μ μμ±μ μμ ν κ²½μ° ReferenceErrorμ€λ₯κ° λ°μνλ€.
[μΆμ²] https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Classes/extends
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/super