π Object μμ±μ ν¨μ
new μ°μ°μλ‘ Object μμ±μ ν¨μλ₯Ό νΈμΆνλ©΄ λΉ κ°μ²΄λ₯Ό μμ±νμ¬ λ°ννκ³ ,
μμ±λ λΉ κ°μ²΄μ νλ‘νΌν° λλ λ©μλλ₯Ό μΆκ°νμ¬ κ°μ²΄λ₯Ό μμ±μν¬ μ μλ€.
//λΉ κ°μ²΄μ μμ±
const person = new Object();
//νλ‘νΌν° μΆκ°
person.name = 'daniel';
person.age = 29;
person.introduce = function(){
console.log(`μ λ ${person.name}μ΄κ³ , μ λμ΄λ ${person.age}μ΄ μ
λλ€.`)
}
console.log(person); // {name: 'daniel', age: 29, introduce: ƒ}
person.introduce(); // μ λ danielμ΄κ³ , μ λμ΄λ 29μ΄ μ
λλ€.
μμ±μ ν¨μλ new μ°μ°μμ ν¨κ» νΈμΆνμ¬ κ°μ²΄λ₯Ό μμ±νλ ν¨μλ₯Ό λ§νκ³ , μμ±μ ν¨μμ μν΄ μμ±λ κ°μ²΄λ₯Ό μΈμ€ν΄μ€λΌ νλ€.
κ°μ²΄λ₯Ό μμ±νλ λ°©μμλ μ¬λ¬κ°μ§ λ°©μμ΄ μκ³ , μμ±μ ν¨μλ₯Ό μ¬μ©ν μ΄μ κ° κ΅³μ΄ μμ΄ λ³΄μΈλ€.
μ μμ±μ ν¨μλ₯Ό μ¨μΌνλ κ²μΌκΉ?
π μμ±μ ν¨μ
κ°μ²΄ 리ν°λ΄μ μν κ°μ²΄ μμ± λ°©μμ λ¬Έμ μ
κ°μ²΄ 리ν°λ΄μ μν κ°μ²΄ μμ± λ°©μμ λ¨ νλμ κ°μ²΄λ§μ μμ±νλ€.
κ·Έλ κΈ°μ νλ‘νΌν° κ΅¬μ‘°κ° λμΌν¨μλ λΆκ΅¬νκ³ κ°μ νλ‘νΌν°μ λ©μλλ₯Ό κ°μ²΄λ₯Ό μμ±ν λλ§λ€ λ§€λ² κΈ°μ ν΄μΌνλ€λ μ·¨μ½ν λ¬Έμ μ μ μ§λλ€.
μμ±μ ν¨μμ μν κ°μ²΄ μμ± λ°©μμ μ₯μ
ν νλ¦Ώ μ²λΌ μμ±μ ν¨μλ₯Ό μ¬μ©νμ¬ νλ‘νΌν° κ΅¬μ‘°κ° λμΌν κ°μ²΄ μ¬λ¬κ°λ₯Ό κ°νΈνκ² μμ±ν μ μλ€.
function Person(name, age){
this.name = name;
this.age = age;
this.introduce = function(){
return console.log(`μ λ ${this.name}μ΄κ³ , μ λμ΄λ ${this.age}μ΄ μ
λλ€.`)
}
}
const noah = new Person('noah', 100);
const daniel = new Person('daniel', 29);
console.log(noah); // Person {name: 'noah', age: 100, introduce: ƒ}
console.log(daniel); // Person {name: 'daniel', age: 29, introduce: ƒ}
this?
thisλ κ°μ²΄ μμ μ νλ‘νΌν°λ λ©μλλ₯΄λ₯Ό μ°Έμ‘°νκΈ° μν μκΈ° μ°Έμ‘° λ³μλ€. thisκ° κ°λ¦¬ν€λ κ°, μ¦ this λ°μΈλ©μ ν¨μ νΈμΆ λ°©μμ λ°λΌ λμ μΌλ‘ κ²°μ λλ€.
ν¨μ νΈμΆ λ°©μ thisκ° κ°λ¦¬ν€λ κ°(this λ°μΈλ©)
μΌλ° ν¨μλ‘μ νΈμΆ μ μ κ°μ²΄
λ©μλλ‘μ νΈμΆ λ©μλλ₯Ό νΈμΆν κ°μ²΄(λ§μΉ¨ν μμ κ°μ²΄)
μμ±μ ν¨μλ‘μ νΈμΆ μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€
μμ±μ ν¨μλ μΌλ° ν¨μμ λμΌνκ² μ μνκ³ , new μ°μ°μμ ν¨κ» νΈμΆνλ©΄ ν΄λΉ ν¨μλ μμ±μ ν¨μλ‘ λμνλλ° new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ₯Ό νΈμΆνμ§ μμΌλ©΄ μμ±μ ν¨μκ° μλλΌ μΌλ° ν¨μλ‘ λμνλ€.
function Person(name, age){
this.name = name;
this.age = age;
this.introduce = function(){
return console.log(`μ λ ${this.name}μ΄κ³ , μ λμ΄λ ${this.age}μ΄ μ
λλ€.`)
}
}
// new μ°μ°μμ ν¨κ» νΈμΆνμ§ μμΌλ©΄ μμ±μ ν¨μλ‘ λμνμ§ μμ.
// μΌλ° ν¨μλ‘μ νΈμΆλ¨.
const noah = Person('noah', 100);
// μΌλ° ν¨μλ‘μ νΈμΆλ Personμ λ°νλ¬Έμ΄ μμΌλ―λ‘ μ묡μ μΌλ‘ undefinedλ₯Ό λ°ννλ€.
console.log(noah); // undefined
// μΌλ° ν¨μλ‘μ νΈμΆλ Person λ΄μ thisλ μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
name // 'noah'
age // 100
introduce() // μ λ noahμ΄κ³ , μ λμ΄λ 100μ΄ μ
λλ€.
μμ±μ ν¨μμ μΈμ€ν΄μ€ μμ± κ³Όμ
μμ±μ ν¨μμ μν
- μΈμ€ν΄μ€λ₯Ό μμ±(νμ)
- μμ±λ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ν(μΈμ€ν΄μ€ νλ‘νΌν° μΆκ° λ° μ΄κΈ°κ° ν λΉ)(μ΅μ )
// μμ±μ ν¨μ
function Person(name, age){
// μΈμ€ν΄μ€ μ΄κΈ°ν
this.name = name;
this.age = age;
this.introduce = function(){
return console.log(`μ λ ${this.name}μ΄κ³ , μ λμ΄λ ${this.age}μ΄ μ
λλ€.`)
}
}
// μΈμ€ν΄μ€ μμ±
const daniel = new Person('daniel', 29); //μ΄λ¦μ΄ λ€λμμ΄κ³ , λμ΄κ° 29μΈ Personκ°μ²΄λ₯Ό μμ±
μμ±μ ν¨μμλ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ λ°ννλ μ½λλ 보μ΄μ§ μλλ°, μ΄λ μλ°μ€ν¬λ¦½νΈ μμ§μ΄ λ€μκ³Ό κ°μ κ³Όμ μΌλ‘ μ묡μ μΌλ‘ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°νν ν μ묡μ μΌλ‘ μΈμ€ν΄μ€λ₯Ό λ°ννκΈ° λλ¬Έμ΄λ€.
μΈμ€ν΄μ€ μμ±κ³Ό this λ°μΈλ©
μ묡μ μΌλ‘ λΉ κ°μ²΄κ° μμ±λλ©° μ΄ λΉ κ°μ²΄κ° λ―Έμμ±μ΄μ§λ§ μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€λ€. κ·Έλ¦¬κ³ μ΄ λΉ κ°μ²΄, μ¦ μΈμ€ν΄μ€κ° thisμ λ°μΈλ©λλ€. μμ±μ ν¨μ λ΄λΆμ thisκ° μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν€λ μ΄μ κ° μ΄κ²μ΄λ€. μ΄ μ²λ¦¬λ νμ λͺΈμ²΄μ μ½λκ° νμ€μ© μ€νλλ λ°νμ μ΄μ μ μ€νλλ€.
function Person(name, age){
console.log(this)// Person {}
this.name = name;
this.age = age;
this.introduce = function(){
return console.log(`μ λ ${this.name}μ΄κ³ , μ λμ΄λ ${this.age}μ΄ μ
λλ€.`)
}
}
const daniel = new Person('daniel', 29);
μΈμ€ν΄μ€ μ΄κΈ°ν
μμ±μ ν¨μμ κΈ°μ λ μ½λκ° μ€νλλ©° thisμ λ°μΈλ©λμ΄ μλ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ννλ€.
thisμ λ°μΈλ©λμ΄ μλ μΈμ€ν΄μ€μ νλ‘νΌν°λ λ©μλλ₯Ό μΆκ°νκ³ μμ±μ ν¨μκ° μΈμλ‘ μ λ¬λ°μ μ΄κΈ°κ°μ μΈμ€ν΄μ€ νλ‘νΌν°μ ν λΉνμ¬ μ΄κΈ°ννκ±°λ κ³ μ κ°μ ν λΉνλ€.
μΈμ€ν΄μ€ λ°ν
μμ±μ ν¨μ λ΄λΆμ λͺ¨λ μ²λ¦¬κ° λλλ©΄ μμ±λ μΈμ€ν΄μ€κ° λ°μΈλ©λ thisκ° μ묡μ μΌλ‘ λ°νλλ€.
function Person(name, age){
// μ묡μ μΌλ‘ λΉ κ°μ²΄κ° μμ±λκ³ thisμ λ°μΈλ©λ¨.
// thisμ λ°μΈλ©λμ΄ μλ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ν
console.log(this)// Person {}
this.name = name;
this.age = age;
this.introduce = function(){
return console.log(`μ λ ${this.name}μ΄κ³ , μ λμ΄λ ${this.age}μ΄ μ
λλ€.`)
}
// μμ±λ μΈμ€ν΄μ€κ° λ°μΈλ©λ thisκ° λ°νλλ€.
}
// μΈμ€ν΄μ€ μμ±. Person μμ±μ ν¨μλ μ묡μ μΌλ‘ thisλ₯Ό λ°ννλ€.
const daniel = new Person('daniel', 29);
λ§μ½ thisκ° μλ λ€λ₯Έ κ°μ²΄λ₯Ό λͺ μμ μΌλ‘ λ°ννλ©΄ thisκ° μλ returnλ¬Έμ λͺ μν κ°μ²΄κ° λ°νλλ©°, μμ κ°μ λ°ννλ©΄ μμ κ°μ 무μλκ³ μ묡μ μΌλ‘ thisκ° λ°νλλ€.
μμ±μ ν¨μμμ λͺ μμ μΌλ‘ thisκ° μλ λ€λ₯Έ κ°μ λ°ννλ κ²μ μμ±μ ν¨μμ κΈ°λ³Έ λμμ νΌμνλ―λ‘ μμ±μ ν¨μ λ΄λΆμμ returnλ¬Έμ μλ΅ν΄μΌ νλ€.
λ΄λΆ λ©μλ [[call]]κ³Ό [[contruct]]
ν¨μλ κ°μ²΄μ΄λ―λ‘ μΌλ° κ°μ²΄μ λμΌνκ² λμν μ μλ€. νμ§λ§ μΌλ° κ°μ²΄λ νΈμΆν μ μλ λ°λ©΄ ν¨μλ νΈμΆμ ν μ μλ€.
ν¨μ κ°μ²΄λ λ€μκ³Ό κ°μ λ΄λΆ μ¬λ‘―κ³Ό λ΄λΆ λ©μλλ₯Ό κ°μ§κ³ μλ€.
- μΌλ° κ°μ²΄κ° κ°μ§λ λ΄λΆ μ¬λ‘― λ° λ©μλ
- [[Environment]]
- [[FormalParameters]]
- [[Call]] : λ΄λΆ λ©μλ, ν¨μκ° μΌλ° ν¨μλ‘μ νΈμΆλλ©΄ νΈμΆλ¨.
- [[Construct]] : λ΄λΆ λ©μλ, ν¨μκ° μμ±μ ν¨μλ‘μ νΈμΆλλ©΄ νΈμΆλ¨.
λ΄λΆ λ©μλ [[call]]μ κ°λ ν¨μ κ°μ²΄λ₯Ό callableμ΄λΌκ³ νλ©° μ΄λ νΈμΆν μ μλ κ°μ²΄, μ¦ ν¨μ κ°μ²΄λ₯Ό λ§νλ€.
[[constructor]]λ₯Ό κ°λ ν¨μ κ°μ²΄λ constructor, [[constructor]]λ₯Ό κ°μ§ μλ ν¨μ κ°μ²΄λ₯Ό non-constructorλΌκ³ νλ€.
λͺ¨λ ν¨μ κ°μ²΄λ νΈμΆμ ν μ μκΈ°μ [[call]]μ κ°μ§λ§ λ°λμ [[constructor]]λ₯Ό κ°μ§μ§λ μλλ€.
constructorμ non-constructorμ ꡬλΆ
μλ°μ€ν¬λ¦½νΈ μμ§μ ν¨μ μ μλ₯Ό νκ°νμ¬ ν¨μ κ°μ²΄λ₯Ό μμ±ν λ ν¨μ μ μ λ°©μμ λ°λΌ
ν¨μλ₯Ό constructor, non-contructorλ‘ κ΅¬λΆνλ€.
- constructor: ν¨μ μ μΈλ¬Έ, ν¨μ ννμ, ν΄λμ€
- non-constructor: λ©μλ(es6μμ λ©μλ μΆμ½ νν), νμ΄ν ν¨μ
ECMAScript μ¬μμμ λ©μλλ‘ μΈμ νλ λ²μκ° μΌλ°μ μΈ μλ―Έμ λ©μλλ³΄λ€ μ’λ€.
μ¬κΈ°μ λ©μλλ ES6μ λ©μλ μΆμ½ ννλ§μ μλ―Ένλ€.
μλμ μ½λλ₯Ό 보면 μ‘°κΈ λ μ΄ν΄κ° μ½κ² λ€.
function foo(){};
const bar = function() {};
const baz = {
x: function(){}
};
new foo(); // foo {}
new bar(); // bar {}
new baz.x(); // x {}
const arrow = () => {};
new arrow(); // Uncaught TypeError: arrow is not a constructor
const obj = {
x(){}
}
new obj.x(); // Uncaught TypeError: obj.x is not a constructor
new μ°μ°μ
μμ±μ ν¨μλ‘μ μ μνμ§ μμ μΌλ° ν¨μλ₯Ό new ν€μλλ‘ νΈμΆνλ©΄ [[construct]]κ° νΈμΆλκ³ ,
ν¨μκ° κ°μ²΄λ₯Ό λ°ννμ§ μμ μ λΉκ°μ²΄λ₯Ό λ°ννλ€.
λ°λλ‘ μμ±μ ν¨μλ₯Ό new μ°μ°μ μμ΄ νΈμΆνκ² λλ©΄ [[call]]μ΄ νΈμΆλκ³ ,
μμ±μ ν¨μμμ μλ thisλ windowλ₯Ό κ°λ¦¬ν€κ² λλ©° μμ±μ ν¨μμ μ μλ νλ‘νΌν°μ λ©μλλ μ μμ νλ‘νΌν°μ λ©μλκ° λλ€.
new.target
new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ‘μ νΈμΆλλ©΄ ν¨μ λ΄λΆμ new.targetμ ν¨μ μμ μ κ°λ¦¬ν¨λ€. new μ°μ°μ μμ΄ μΌλ° ν¨μλ‘μ νΈμΆλ ν¨μ λ΄λΆμ new.targetμ undefinedλ€. μ΄λ₯Ό μ΄μ©νμ¬ μμ±μ ν¨μκ° newμμ΄ νΈμΆλμμ λ new μ°μ°μμ ν¨κ» μ¬κ· νΈμΆμ ν΅ν΄ μμ±μ ν¨μλ‘μ νΈμΆμ ν μ μλ€.
function Person(name, age){
this.name = name;
this.age = age;
this.introduce = function(){
return console.log(`μ λ ${this.name}μ΄κ³ , μ λμ΄λ ${this.age}μ΄ μ
λλ€.`)
}
if(!new.target){
return new Person(name, age);
}
}
const daniel = Person('daniel', 29);
μΆμ² : λͺ¨λ μλ°μ€ν¬λ¦½νΈ λ₯λ€μ΄λΈ
'JavaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JavaScript] Webpack (0) | 2021.12.11 |
---|---|
[JavaScript] ν¨μμ μΌκΈ κ°μ²΄ (0) | 2021.11.28 |
[JavaScript] λΉνΈμΈ κ°μ²΄ (0) | 2021.11.05 |
[JavaScript] Symbol (0) | 2021.10.23 |
[JavaScript]μ μ λ³μμ λ¬Έμ μ (0) | 2021.10.06 |