prototypeμ μμ±μ ν¨μ λ΄λΆμ propertyμ΄λ€. μ΄ νλ‘ν νμ μ μμ±μ ν¨μλ₯Ό ν΅ν΄ λ§λ κ°μ²΄, μΈμ€ν΄μ€κ° μ¬μ©ν λ©μλλ₯Ό μ μ₯νκ³ μλ€. μμ±μν¨μλ₯Ό ν΅ν΄ μΈμ€ν΄μ€λ₯Ό λ§λ€λ©΄ μΈμ€ν΄μ€ λ΄λΆμ μλμΌλ‘
__proto__
κ° νλ‘νΌν°λ‘ μμ±λλλ° μ΄ νλ‘νΌν°λ μΈμ€ν΄μ€κ° μ¬μ©ν λ©μλ, μ¦ μμ±μ ν¨μμ prototypeμ μ°Έμ‘°νλ€. μ΄λ μλ΅μ΄ κ°λ₯νλλ‘ ννν μ μμ΄ λ§μΉ μμ±μν¨μμ νλ‘ν νμ μ μμ μ νλ‘νΌν°μΈ κ²λ§λ₯ μ¬μ©ν μ μκ² λλ€. λν, λ©μλμ€λ²λΌμ΄λ μμ± λλ¬Έμ μμ±μν¨μμ λ©μλλ μμ μ λ©μλ μνλ μ μ§νλ©΄μλ μΈμ€ν΄μ€λ³λ‘ μ¬ μ μν μ μμ΄ μν©μ λ§κ² 컀μ€ν νμ¬ μ¬μ©ν μ μλ€. λλ¬Έμ μΈμ€ν΄μ€μ λ©μλλ₯Ό νΈμΆνλ©΄ λ¨Όμ μΈμ€ν΄μ€μ ν΄λΉ λ©μλκ° νλ‘νΌν°μ ν¬ν¨λμ΄μλμ§λ₯Ό νμ νκ³ , μλ€λ©΄ νλ‘νΌν° 체μ΄λ μμ±μΌλ‘__proto__
λ₯Ό ν΅ν΄ μμ±μν¨μμ λ©μλλ₯Ό μ€ννκ² λλ€.
__proto__
var Person = function(name){
this._name=name
}
Person.prototype.getName=function(){
console.log(this)
return 'My name is '+this._name
}
const guest1=new Person('namju')
Personμ΄λΌλ μμ±μν¨μλ₯Ό ν΅ν΄ guest1μ΄λΌλ μΈμ€ν΄μ€λ₯Ό μμ±νμλ€.
λ€μλΆν° λΉκ΅ν΄λ³΄λ©΄
guest1.getName()
//this:
Person {_name: "namju"}_name: "namju"[[Prototype]]: Object
//return:
"My name is namju"
guest1.__proto__.getName()
//this:
{getName: Ζ, constructor: Ζ}
//return: "My name is undefined"
μΈμ€ν΄μ€μμ λ°λ‘ λ©μλλ₯Ό νΈμΆνλ©΄ μ΄λ¦μ΄ μ λλ‘ λμ€κ³
μΈμ€ν΄μ€μ νλ‘ν λ‘ μ κ·Όνλ©΄ undefinedκ° λ°νλμλ€.
μ΄λ λ©μλλ₯Ό νΈμΆν λ, λ©μλ μμμλ κ°μ²΄λ₯Ό thisλ‘ μ§μ νκΈ° λλ¬Έμ κ°μ΄ μλνλλ‘ λμ€μ§ λͺ»νλλ°,
guest1.getName()
μμμ thisλ guest1 μ΄μ΄μ guest1._nameμ λΆλ¬μ¬ μ μμκ³
guest1.__proto__.getName()
μμμ thisλ guest1.__proto__
μΈλ° μ΄λ Person.prototype
κ³Ό λμΌνλ€.
Person.prototype = {getName: Ζ, constructor: Ζ}
μμλ _nameμ΄λΌλ μμ±μ μ°Ύμ μ μκΈ° λλ¬Έμ undefinedλ₯Ό λ°ν ν κ²μ΄λ€.
λλ¬Έμ μΈμ€ν΄μ€μ __proto__
κ° μμ±μν¨μμ prototypeμ μ°Έμ‘°νλ€κ³ νμ¬λ thisλ₯Ό μΈμ€ν΄μ€λ‘ μ§μ νμ¬ μ€νν λμ __proto__
λ₯Ό μλ΅νκ³ νΈμΆν΄μΌ νλ€.
μ¦, μμ±μ ν¨μμ prototypeμ λ©μλ, νλ‘νΌν°λ μΈμ€ν΄μ€μμλ μμ μ λ©μλ, νλ‘νΌν°μΈ κ²μ²λΌ μ κ·Όνμ¬ μ¬μ©ν μ μλ€.
λ§μΌ, μΈμ€ν΄μ€κ° λμΌν μ΄λ¦μ νλ‘νΌν°λ λ©μλλ₯Ό κ°κ²λλ€λ©΄ μ΄λ»κ² λ κΉ, μλμ μμλ μμ±μν¨μμ singμ΄λΌλ λ©μλλ₯Ό λΆμ¬νκ³ , μΈμ€ν΄μ€μ λκ°μ΄ singμ΄λΌλ λ©μλλ₯Ό μΆκ° νλ μ½λμ΄λ€.
var Singer = function(song){
this.song=song
}
Singer.prototype.sing = function(){
console.log(this)
return this.song+'λΌλΌλΌ~'
}
const iu = new Singer('λ΄μμμ‘μ ')
const biber = new Singer('peaches ')
iu.sing = function(){
console.log(this)
return 'μ€λμ λ
Έλλ '+this.song
}
iu.sing()
// "μ€λμ λ
Έλλ λ΄μμμ‘μ "
biber.sing()
// "peaches λΌλΌλΌ~"
λ©μλλ₯Ό μλ‘ μ μν μΈμ€ν΄μ€(iu)μμλ μμ±μν¨μμμ μ ν λ©μλ κ²°κ³Ό(this.song+λΌλΌλΌ)κ° μλ μΈμ€ν΄μ€μμ μ§μ ν λ©μλλ‘ λ³κ²½λμ΄ μ€νλμκ³ , iuμ biberμ κ²°κ³Όλ₯Ό λΉκ΅ν΄λ³΄λ©΄ κΈ°μ‘΄μ λ©μλκ° μ¬λΌμ§ κ²μ μλλ κ±Έ νμΈν μ μλ€.
μ¦ κΈ°μ‘΄μ λ©μλλ₯Ό μμ λ©΄μ μλ‘μ΄ λ©μλλ‘ λ³κ²½ν κ²μ΄ μλ μλ³Έμ μ μ§λκ³ μλ μνμμ λ€λ₯Έ λ©μλλ₯Ό μΉμ κ°λ
μ΄λ€.
μ΄κ²μ 'λ©μλ μ€λ²λΌμ΄λ©' μ΄λΌκ³ νλ€
λ€λ₯΄κ² νννλ©΄ κ° μΈμ€ν΄μ€ λ³λ‘ 컀μ€ν νν λ©μλλ₯Ό μ€νμν¬ μ μλ μ₯μ μ΄λ€.
λ©μλκ° μ€λ²λΌμ΄λ λ κ²μ΄κΈ° λλ¬Έμ μΈμ€ν΄μ€μ __proto__
λ‘ μ°ννλ©΄ λ€μ μμ±μν¨μμ λ©μλμ μ κ·Όν μ μλ€.
iu.sing() //"μ€λμ λ
Έλλ λ΄μμμ‘μ "
iu.__proto__.sing() //undefined λΌλΌλΌ
μμ κ°μ λ°©λ²μΌλ‘ sing λ©μλλ₯Ό μ€νμμΌλ³΄λ©΄ thisμ μ°¨μ΄μ λ°λΌ songμ λ°ννκ±°λ undefinedλ₯Ό λ°ννλ€.(iu.__proto__
μλ song νλ‘νΌν°κ° μμΌλ―λ‘ undefined)
κ·ΈλΌ songμ΄λΌλ νλ‘νΌν°λ₯Ό λ§λ€μ΄μ£Όλ©΄ μ¬λ°λ₯Έ κ°μ λ°νν μ μμ κ²μΈλ°, callμ΄λ applyλ‘ thisλ₯Ό μ§μ ν΄μ£Όμ΄ thisλ₯Ό μνλ μΈμ€ν΄μ€λ‘ λ°κΏ μ€ μ μλ€.
iu.__proto__.song = 'μ€λ¬Όμ
'
iu.__proto__.sing.call(iu)
//μ€λ¬Όμ
λΌλΌλΌ
μ²μμ μμ±μν¨μμ λ©μλλ‘ μ€νμ μμΌ°λ€.
Singer {song: "λ΄μμμ‘μ"}
song: "λ΄μμμ‘μ"
[[Prototype]]: Object
sing: Ζ ()
song: "μ€λ¬Όμ
"
constructor: Ζ (song)
[[Prototype]]: Object
μλ°μ€ν¬λ¦½νΈ μμ§μ΄ singμ΄λΌλ λ©μλλ₯Ό μ°Ύλ λ°©μμ νΈμΆν μμ μΌλ‘λΆν° κ°μ₯ κ°κΉμ΄ νλ‘νΌν° μ€μμ λ©μλλ₯Ό μ°Ύλ κ²μ΄λ€. μμΌλ©΄ λ°ννκ³ , μμΌλ©΄__proto__
λ₯Ό κ²μνμ¬ λ©μλλ₯Ό μ°Ύλλ€. μ΄ μ²λΌ __proto__
νλ‘νΌν°κ° μ°μμ μΌλ‘ μ΄μ΄μ§λ κ²μ νλ‘ν νμ
체μΈμ΄λΌνκ³ , 체μΈμ λ°λΌκ°λ©° κ²μνλ κ²μ νλ‘ν νμ
체μ΄λμ΄λΌκ³ νλ€.
(μμμ iu μΈμ€ν΄μ€ μ μ₯μμλ, singλ©μλλ₯Ό μ€ννμ λ constructorμ singλ©μλκΉμ§ κ°νμμμ΄ μμ μ scopeλ΄ singλ©μλλ₯Ό μ€νμν¨ κ²μ΄κ³ , μ΄ λ©μλμμ νμν song μμ μμμμ μ°Ύμ νμμμ΄ μμ μ μμΉλ΄ μ μλ songνλ‘νΌν°λ₯Ό μ¬μ©ν κ²μ΄λ€.
λ°λ©΄ biberλ μΈμ€ν΄μ€ κ°μ²΄ λ΄λΆμ singλ©μλκ° μμΌλ―λ‘ νλ‘ν νμ 체μΈμ λ°λΌμ¬λΌκ° μμ±μν¨μμ singλ©μλλ₯Ό μ€ννλ€. )
κ³Όκ±°μ λ΄κ° 보λ΄λ μ°Έκ³ λ§ν¬ -_-