ν¨μμ μμμ νλΌλ―Έν° - this #2
μμμ νλΌλ―Έν°μΈ thisμ λν΄μ μμλ΄ λλ€.
Sep 27, 2021
ν¨μμ μμμ νλΌλ―Έν°λ 4νΈμΌλ‘ μ΄λ£¨μ΄μ Έ μμ΅λλ€.
λ€μ΄κ°λ©°
μ΄λ² ν¬μ€ν μμλ μ΄μ μ₯μ μ΄μ΄μ μμ±μλ₯Ό ν΅ν νΈμΆμ μμλ³΄κ² μ΅λλ€.
ν¨μλ‘μ νΈμΆλ©μλλ‘μ νΈμΆ- μμ±μλ‘μ νΈμΆ
- call λ° applyλ₯Ό ν΅ν νΈμΆ
μμ±μ ν¨μ
μΌλ°μ μΌλ‘ μμ±μ ν¨μλ μΌλ° ν¨μμ κΈ°μ μ μΈ μ°¨μ΄λ μκ³ μλ λ κ΄λ‘λ₯Ό λ°λ¦ λλ€.
1. ν¨μ μ΄λ¦μ 첫 κΈμλ λλ¬Έμλ‘ μμν©λλ€.
2. λ°λμ βnewβ μ°μ°μλ₯Ό λΆμ¬ μ€νν©λλ€.
μμ μ μλμ΄ 9μ ν¬μ€ν μμ μμ±μ ν¨μμ λν΄μ μ€λͺ ν΄ μ£Όμ ¨λλ°μ.μ κ° λ μ΄ν΄λ³Ό μ μ new μ°μ°μλ₯Ό μ΄μ©νμ¬ μμ±μ ν¨μλ₯Ό νΈμΆν λμ thisκ° λ¬΄μμ λ°νν κΉ? μ λλ€.
function MyFunction() {
this.skulk = function() {
return this
}
}
const my = new MyFunction()
const my2 = MyFunction()
// 첫λ²μ§Έ μ§λ¬Έ
console.log("my1", my.skulk() === my)
// λλ²μ§Έ μ§λ¬Έ
console.log("my2", my2.skulk() === my2)
첫 λ²μ§Έ μ§λ¬Έ, λ λ²μ§Έ μ§λ¬Έμμ μ΄λ€ κ²°κ³Όκ° μΆλ ₯ λ κΉμ?
jsfiddleμμ νμΈν΄μ£ΌμΈμnew μ°μ°μμ λμ
new μ°μ°μλ₯Ό μ¬μ©νλ©΄ μλμ κ°μ μκ³ λ¦¬μ¦μ΄ λμν©λλ€.
- λΉ κ°μ²΄λ₯Ό λ§λ€μ΄ thisμ ν λΉν©λλ€.
- ν¨μ λ³Έλ¬Έμ μ€νν©λλ€. thisμ μλ‘μ΄ νλ‘νΌν°λ₯Ό μΆκ°ν΄ thisλ₯Ό μμ ν©λλ€.
- thisλ₯Ό λ°νν©λλ€.
function User(name) {
// this = {}; (λΉ κ°μ²΄κ° μμμ μΌλ‘ λ§λ€μ΄μ§)
// μλ‘μ΄ νλ‘νΌν°λ₯Ό thisμ μΆκ°ν¨
this.name = name;
this.isAdmin = false;
// return this; (thisκ° μμμ μΌλ‘ λ°νλ¨)
}
μ΄μ 첫 λ²μ§Έ μ§λ¬Έμ λν λ΅μ νμΈν μ μμ΅λλ€.
thisμ ν λΉλ μλ‘κ² μμ±λ κ°μ²΄λ new μ°μ°μμ κ°μΌλ‘ λ°νλκ³ skulkλ this μκΈ° μμ μ λ°ννκΈ° λλ¬Έμ trueκ° λ©λλ€.
λ λ²μ§Έ μ§λ¬Έμ my2λ₯Ό μμ±ν λ new μ°μ°μλ₯Ό μ¬μ©νμ§ μμμ΅λλ€. ν¨μλ‘μ νΈμΆλμκΈ° λλ¬Έμ μ΄μ μ₯μ μ€λͺ μ²λΌ thisλ μ μ κ°μ²΄ windowκ° λ©λλ€.
console.log("my2", my2.skulk() === my2) // Cannot read properties of undefined (reading 'skulk')
console.log("my2", window.skulk() === window) // true
μμ±μ ν¨μμμ μ체 κ°μ λ°ννλ©΄ μ΄λ»κ² λ κΉ?
μ new μ°μ°μμ λμμμ thisμ λΉ κ°μ²΄κ° μμμ μΌλ‘ λ§λ€μ΄μ§κ³ μμμ μΌλ‘ λ°νλλ€κ³ νμ΅λλ€.
μ¬κΈ°μ λ€λ₯Έ κ°μ μ체μ μΌλ‘ λ°ννλ©΄ μ΄λ»κ² λ κΉμ?
κ°μ λ°ν
function MyFunction() {
this.skulk = function() {
return true
}
return 1
}
const my = new MyFunction()
console.log(MyFunction() === 1) // ?
console.log(my.skulk() === true) // ?
κ²°κ³Όλ jsfiddleμμ νμΈν΄μ£ΌμΈμ!
κ²°κ³Όλ₯Ό μ€νν΄ λ³΄λ©΄ MyFunction ν¨μκ° 1μ λ°ννλ€λ μ¬μ€μ μ½λ λμ λ°©μμ ν° μν₯μ λ―ΈμΉμ§ μμ΅λλ€.
MyFunctionμ ν¨μλ‘ νΈμΆνλ©΄ 1μ 리ν΄ν©λλ€.
new μ°μ°μλ₯Ό μ΄μ©νμ¬ μμ±μλ‘ νΈμΆνμ¬λ κ°μ²΄κ° μμ±λκ³ skulk λ©μλλ μ¬λ°λ₯΄κ² λ°νλ©λλ€.
κ°μ²΄λ₯Ό λ°ν
const obj = {
skulk: 1
}
function MyFunction2() {
this.skulk = 2
return obj
}
const my2 = new MyFunction2()
console.log(my2 === obj)
console.log(my2.skulk === 1)
κ²°κ³Όλ jsfiddleμμ νμΈν΄μ£ΌμΈμ!
κ°μ²΄λ₯Ό λ°νν λλ κ°μ λ°νν λμλ μ’ λ€λ¦ λλ€.
thisμ λΉ κ°μ²΄κ° μμμ μΌλ‘ λ§λ€μ΄μ§κ³ λ°νλμ΄μΌ νλλ° obj κ°μ²΄κ° λ°νλμμ΅λλ€.
μ΄ κ²½μ°μλ μμ±μκ° κ°μ²΄λ₯Ό λ°ννλ©΄ ν΄λΉ κ°μ²΄λ μ 체 new μ°μ°μμ μμ±μ ν¨μλ‘ λ°νλκ³ thisμ ν λΉλ λΉ κ°μ²΄λ λ²λ €μ§λλ€.
κ·μΉ
μμμ λ³΄μ ¨λ€μνΌ κ°μ²΄λ₯Ό λ°νν λλ thisμ ν λΉλ κ°μ²΄λ 무μλ©λλ€.
μμ±μλ‘ νΈμΆλλ ν¨μλ μΌλ°μ μΌλ‘ μΌλ° ν¨μμ λ€λ₯΄κ² μ½λ©λκ³ μ¬μ©λλ©°, μμ±μλ‘ νΈμΆλμ§ μλ ν κ·Έλ€μ§ μ μ©νμ§ μκΈ° λλ¬Έμ
μμ±μλ₯Ό μΌλ° ν¨μ λ° λ©μλμ ꡬλ³νκΈ° μν΄ λͺ λͺ κ·μΉμ΄ μκ²Όμ΅λλ€.
ν¨μμ λ©μλλ μΌλ°μ μΌλ‘ νλ μΌμ μ€λͺ νλ λμ¬λ‘ μμνκ³ μλ¬Έμλ‘ μμνμ¬ μ΄λ¦μ΄ μ§μ΄μ§λλ€.
μμ±μλ μΌλ°μ μΌλ‘ User, Employee, Personκ³Ό κ°μ΄ λλ¬Έμλ‘ μμνμ¬ μμ±λλ κ°μ²΄λ₯Ό μ€λͺ νλ λͺ μ¬λ‘ λ§λ€κ² λ©λλ€.
μλ°μ€ν¬λ¦½νΈλ μ κ·Έ λͺ¨μμΌκΉ?μλ°μ€ν¬λ¦½νΈλ μ κ·Έ λͺ¨μμΌκΉλ μ± 1μ₯ μ΄λ¦μμλ μ΄λ κ² μκΈ°ν©λλ€.
μλ°μ€ν¬λ¦½νΈμ λͺ¨λ μ΄λ¦μ λ°λμ μλ¬Έμλ‘ μμν΄μΌ ν©λλ€. μ΄λ μλ°μ€ν¬λ¦½νΈμ new μ°μ°μ λ¬Έμ λλ¬Έμ λλ€. ν¨μ νΈμΆλ¬Έμ΄ newλ‘ μμνλ©΄ ν΄λΉ ν¨μλ μμ±μλ‘μ νΈμΆλκ³ , κ·Έλ μ§ μμΌλ©΄ ν¨μλ‘μ νΈμΆλ©λλ€. μμ±μμ ν¨μμ κΈ°λ₯μ μλΉν λ€λ¦ λλ€. μμ±μλ₯Ό μλͺ»λ λ°©μμΌλ‘ νΈμΆνλ©΄ μλ¬κ° λ°μν μ μμ΅λλ€. λ ν·κ°λ¦¬λ μ μ μμ±μμ ν¨μλ κ²μΌλ‘λ μμ ν λκ°μ 보μΈλ€λ μ μ λλ€. κ·Έλμ newλ₯Ό μ¨μΌ νλλ° μ°μ§ μμ κ²½μ°, νΉμ λ°λλ‘ μλͺ» μ¬μ©ν newλ‘ μΈν΄ λ°μνλ λ¬Έμ λ₯Ό μλμΌλ‘ κ°μ§ν λ°©λ²μ΄ μμ΅λλ€. κ·Έλμ ν κ°μ§ μ½μμ νμ΅λλ€. λͺ¨λ μμ±μ ν¨μμ μ΄λ¦μ λλ¬Έμλ‘ μμλμ΄μΌ νλ©°, κ·Έλ μ§ μμ κ²½μ° λͺ¨λ κ²½μ°λ μλ¬Έμλ‘ μμλμ΄μΌ ν©λλ€. κ·Έλ κ² ν΄μ μλ¬λ₯Ό μ€μΌ μ μλ μκ°μ μ νμλ₯Ό μ 곡ν©λλ€.
μ¬κΈ°μ μ μ λκΈλ¬μ€ ν¬λ½ν¬λ(JSONμ λ§λ λΆμ λλ€.)κ° μ μνλ λ°©λ² μ€ νλλ μ λ newλ₯Ό μ¬μ©νμ§ λ§μλΌ μ λλ€. newλ₯Ό μ°μ§ μμΌλ©΄ λλ¬Έμλ‘ μμνλ μ΄λ¦μ μΈμΌ λ μλ€κ³ ν©λλ€.
μ μ΄μ ν·κ°λ¦¬μ§ μκ² μ¬μ©νμ§ μλ νΈμ΄ μ’λ€.λΌλ μ λλ‘λ§ μ§κ³ λμ΄κ°λ©΄ μ’μ λ―ν©λλ€. (μ΄ μΈμμλ λ€μν μκ²¬μ΄ μ‘΄μ¬νκ³ λ§μ΄λ€ μΈμ°μ§μ. ν vs μ€νμ΄μ€λ°μ²λΌ)
κ°μΈμ μΌλ‘λ Classμμ μ¬μ©λλ new λ¬Έλ²μ μμ±μ ν¨μμ newμ μ’ λ€λ₯΄μ§ μλ μκ°λμ§λ§ ES6λ₯Ό μ¬μ©ν μ μλ νκ²½μμ Class μμ΄ μ¬μ¬μ© κ°μ²΄λ₯Ό λ§λ€λ €λ©΄ μ§μ λ§λ€μ΄λ λ©λλ€.(μμ μ μλ μμ λ₯Ό μ’ κ°μ Έμμ΅λλ€.)
function user(who, when, what) {
const _who = who;
const _when = when;
const _what = what;
function printAll() {
return `${_when} ${_who} ${_what}`;
}
return Object.freeze({
who: _who,
when: _when,
what: _what,
printAll
})
}
// μλ‘μ΄ κ°μ²΄ μμ±
let user1 = user('woman', 2021, 'studying');
let user2 = user("man", 2020, "hello")
console.log(user1);
console.log(user2);
λ§μΉλ©°
μ΄λ² ν¬μ€ν μμλ
- μμ±μλ‘μ νΈμΆ
μ λν΄ μμλ΄€μ΅λλ€.
λ€μ ν¬μ€ν μμλ call λ° applyλ₯Ό ν΅ν νΈμΆμ μμλ³΄κ² μ΅λλ€.
μ½μ΄μ£Όμ μ κ°μ¬ν©λλ€.