μ§λ 첫λ²μ§Έ νλ‘ν νμ ν¬μ€ν μμ μμμ κ°λ κ³Ό λͺ¨λ κ°μ²΄μ νλ‘ν νμ μ΅μμμ μμΉν Object κ°μ²΄μ λν΄ μμ보μλ€.
μ΄λ² ν¬μ€ν μ νλ‘ν νμ μ μ΄μ©ν μμ λ°©λ²κ³Ό νλ‘ν νμ 체μΈμ λν΄ μ 리ν΄λ³΄μ.
μμμ νΉμ κ°μ²΄μ νλ‘νΌν°λ λ©μλλ₯Ό μμ κ°μ²΄κ° κ·Έλλ‘ μ¬μ©ν μ μκ² νλ κΈ°λ₯μ΄λ€.
μλ°μ€ν¬λ¦½νΈλ νλ‘ν νμ
μ κΈ°λ°μΌλ‘ μμμ ꡬννκ³ , μ΄λ₯Ό ν΅ν΄ λΆνμν μ€λ³΅μ μ κ±°νλ€.
μ΄λ€ λ°©μμΌλ‘ μ΄λ£¨μ΄ μ§λμ§ μ½λλ₯Ό 보면μ μ΄ν΄λ³΄λλ‘ νμ!
// μμ±μ ν¨μ
function Circle(radius) {
this.radius = radius;
this.getArea = function () {
return Math.PI * this.radius ** 2;
};
}
// λ°μ§λ¦μ΄ 1μΈ λκ·ΈλΌλ―Έ
const circle1 = new Circle(1)
// λ°μ§λ¦μ΄ 2μΈ λκ·ΈλΌλ―Έ
const circle2 = new Circle(2)
μ μ½λλ₯Ό μ΄ν΄λ³΄λ©΄ Circleμ΄λ μμ±μ ν¨μλ₯Ό μ μνκ³ Circleκ°μ²΄ λκ°λ₯Ό μμ±νλ€.
getArea
λ©μλμ κ²½μ°, Circle κ°μ²΄λ₯Ό λ§λ€λλ§λ€ κ°λ³μ μΌλ‘ κ°μ²΄ μμ μμ±μ΄ λμ΄ μ‘΄μ¬νκ² λλ€.
μ¦, circle1κ³Ό circle2μ getArea λ©μλλ λ€λ₯΄λ€!
console.log(circle1.getArea === circle2.getArea); // false
radiusμ κ²½μ° κ°κ°μ κ°μ²΄μ λ°λΌ λ€λ₯Έ κ°μ΄ μ£Όμ΄μ§κΈ°μ λͺ¨λ κ°μ²΄λ€μ΄ κ°μ ΈμΌ νμ§λ§,
methodμ κ²½μ° κ°μ λμμ μννκΈ° λλ¬Έμ νλλ§ μμ±νκ³ κ³΅μ νκ²λ ν΄μ λΆνμν λ©λͺ¨λ¦¬κ° λλΉ λλκ²μ λ§λκ² λ°λμ§νλ€.
μ΄μ νλ‘ν νμ μ μ΄μ©ν΄ μμμ ꡬνν΄μ μμ μ½λλ₯Ό κ°μ ν΄λ³΄μ!
// μμ±μ ν¨μ
function Circle(radius) {
this.radius = radius;
}
Circle.prototype.getArea = function () {
return Math.PI * this.radius ** 2;
};
// λ°μ§λ¦μ΄ 1μΈ λκ·ΈλΌλ―Έ
const circle1 = new Circle(2);
// λ°μ§λ¦μ΄ 2μΈ λκ·ΈλΌλ―Έ
const circle2 = new Circle(4);
circle1.getArea(); // 4
circle κ°μ²΄κ° μλλΌ, circleμ νλ‘ν νμ
κ°μ²΄μ getArea λ©μλλ₯Ό μ μΈν¨μΌλ‘μ¨, λͺ¨λ circle μΈμ€ν΄μ€μκ² getArea
λ©μλλ₯Ό 곡μ νμ¬ μ¬μ©ν μ μκ²λ νλ€.
console.log(circle1.getArea === circle2.getArea); // true
λ°λΌμ μμ±λ circle μΈμ€ν΄μ€λ€μ κ°μμ μκ΄ μμ΄getArea
λ©μλλ νλλ§ μμ±λκ³ ,
μμ±λ μΈμ€ν΄μ€λ€μ΄ νλ‘ν νμ
κ°μ²΄μ μ κ·Όνμ¬ λ©μλλ₯Ό μ€νν μ μλλ‘ νλ€!
μμ μ½λμ λΉν΄μ ν¨μ¬ ν¨μ¨μ μΈ μ½λκ° λμλ€.
κ·Έλ λ€λ©΄ νλ‘ν νμ
νλ‘νΌν°λ λͺ¨λ κ°μ²΄κ° κ°λ κ²μΌκΉ? κ²°λ‘ μ 미리 μκΈ°νμλ©΄ λͺ¨λ κ°μ²΄κ° κ°μ§κ³ μμ§λ μλ€.
λ€μ μμλ₯Ό 보μ.
function Person(name){
this.name = name;
}
const Person2 = name => {
this.name = name;
}
console.log(Person.prototype); // {constructor f}
console.log(Person2.prototype); // undefined
const p1 = new Person('sihyun');
const p2 = new Person2('sihyun2'); // TypeError: Person2 is not a constructor
μ€ν κ²°κ³Όλ₯Ό 보면, μμ±μλ‘μ νΈμΆν μ μλ Personμ prototype νλ‘νΌν°λ₯Ό κ°μ§κ³ μμ§λ§
νμ΄ν ν¨μμΈ Person2λ prototype νλ‘νΌν°λ₯Ό κ°μ§κ³ μμ§ μμκ²μ νμΈν μ μλ€.
μ¦, μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ μμ±μ ν¨μλ§μ΄ νλ‘ν νμ νλ‘νΌν°λ₯Ό κ°λλ€.
νμ΄ν ν¨μκ° μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ μ΄μ λ [[Construct]]λΌλ λ΄λΆ λ©μλλ₯Ό κ°μ§κ³ μμ§ μκΈ° λλ¬ΈμΈλ°, ν΄λΉ λ΄μ©μ λν΄ κΆκΈνλ€λ©΄ μμ±μ ν¨μμ μν κ°μ²΄ μμ± ν¬μ€ν μ μ°Έμ‘°νλ©΄ λ κ² κ°λ€.
κ·Έλ¬λ©΄ μμλ°μ κ°μ²΄λ μ΄λ»κ² λΆλͺ¨μ λ©μλλ₯Ό μ§μ μ¬μ©ν μ μμκΉ?π€
μ΄μ λν΄ μ΄ν΄νλ €λ©΄ νλ‘ν νμ
체μΈμ μμμΌνλ€.
π‘ νλ‘ν νμ 체μΈμ΄λ?
μλ°μ€ν¬λ¦½νΈμμ κ°μ²΄μ νλ‘νΌν°λ λ©μλλ₯Ό μ°Έμ‘°νκ² λλ©΄, ν΄λΉ κ°μ²΄μμ νλ‘νΌν°λ₯Ό μ°Ύμλ³΄κ² λκ³ λ°κ²¬νμ§ λͺ»νλ©΄ κ·Έ νλ‘ν νμ κ°μ²΄(λΆλͺ¨ κ°μ²΄)λ‘ μ΄λνμ¬ ν΄λΉ νλ‘ν νμ κ°μ²΄ λ΄μμ λ©€λ²λ₯Ό μ°Ύλλ€.
μ΄ κ³Όμ μ λ©€λ²λ₯Ό μ°Ύκ±°λ, λ©€λ²λ₯Ό μ°Ύμ§ λͺ»νκ³ μ΅μμ μ€λΈμ νΈμΈ Objectμ νλ‘ν νμ κ°μ²΄κΉμ§ κ²μνλ©΄ λλκ² λλ€.
μ΄λ¬ν κ°μ²΄λ€μ μ°μλ₯Ό κ°λ¦¬μΌ νλ‘ν νμ 체μΈ(prototype chain)μ΄λΌκ³ νλ€.
μ½κ² λ§νλ©΄ μμκ³Ό λΆλͺ¨κ°μ²΄λ νλ‘ν νμ 체μ΄λμΌλ‘ μ°κ²°λμ΄ μκ³ , μμ κ°μ²΄μ μλ νλ‘νΌν°λ λ©μλλ λΆλͺ¨κ°μ²΄, κ·Έ λΆλͺ¨κ°μ²΄μμ κ²μνμ¬ μ¬μ©νλ€λ μ΄μΌκΈ°μ΄λ€!
μ, κ·Έλ¬λ©΄ μμ λ₯Ό ν΅ν΄μ νλ‘ν νμ 체μΈμ κ²μνλ κ³Όμ μ μ΄ν΄ν΄λ³΄μ.
// μμ±μ ν¨μ
function Person(name) {
this.name = name;
}
let foo = new Person('Lee');
Person.prototype.sayHello = function(){
console.log('Hi! my name is ' + this.name);
};
foo.sayHello();
μμ±λ foo κ°μ²΄μμ sayHello
λ©μλλ₯Ό νΈμΆνκ² λλ©΄, μΌλ¨ ν΄λΉ foo κ°μ²΄ μμμ sayHello
λ©μλλ₯Ό μ°Ύλλ€.
κ·Έ μ΄ν κ²μμ μ€ν¨νλ©΄, ν΄λΉ κ°μ²΄μ λΆλͺ¨κ°μ²΄μΈ Person.prototype κ°μ²΄μ μ κ·Όν΄μ sayHello
λ©μλλ₯Ό μ°Ύκ³ , κ²μμ μ±κ³΅νμ¬ ν¨μλ₯Ό νΈμΆνκ² λλ κ²μ΄λ€!
μ¦, μλμ κ°μ κ΅¬μ‘°λ‘ νλ‘ν νμ 체μ΄λμ΄ νμ±λλ€.
μ΄λ―Έμ§ μΆμ² : https://poiemaweb.com/js-prototype
μ΄λ κ² νλ‘ν νμ
체μΈμ΄ μ°κ²°λμ΄ μκΈ° λλ¬Έμ, foo κ°μ²΄λ λΆλͺ¨ κ°μ²΄μΈ Person.prototype κ°μ²΄μμ sayHello
λ©μλλ₯Ό μ°Ύμμ μ΄μ©ν μ μλ κ²μ΄λ€!
μ§κΈκΉμ§ λ νΈμ κ±Έμ³μ νλ‘ν νμ μ λν΄ μμ보μλ€! πππ
constructorμ Object.create ν¨μμ λν΄μλ λ€λ€λ³ΌκΉ νλλ°, ν¬μ€ν λ΄μ©μ΄ λ무 κΈΈμ΄μ§ κ² κ°μ μλ΅νμλ€.
μ¬μ€ μ λ²μ£Όμ μμ±νλ €κ³ νλ ν¬μ€ν
μΈλ° μ΄κ² μ κ² μ§ννλκ² λ§λ€λ³΄λ μ‘°κΈ λ¦μΆ°μ‘λ€.
μ΅κ·Όμ μ§μ€λ ₯μ΄ μ‘°κΈ λ¨μ΄μ§ κ² κ°μλ°, μ‘°κΈ λ νλ΄μ ν΄λ΄μΌκ² λ€!πͺπͺ