πΈ17μ₯. μμ±μ ν¨μμ μν κ°μ²΄ μμ±
10μ₯ βκ°μ²΄ 리ν°λ΄βμμ μ΄ν΄λ³Έ κ°μ²΄ 리ν°λ΄μ μν κ°μ²΄ μμ± λ°©μ μΈμ, κ°μ²΄λ₯Ό μμ±νλ λ€μν λ°©λ²μ λν λ΄μ©μ μ΄ν΄λ³Ό μμ μ΄λ€.
β
17.1 Object μμ±μ ν¨μ
μμ±μ ν¨μ(constructor)λ, new μ°μ°μμ ν¨κ» νΈμΆνμ¬ κ°μ²΄(μΈμ€ν΄μ€)λ₯Ό μμ±νλ ν¨μ
μΈμ€ν΄μ€(instance)
: μμ±μ ν¨μμ μν΄ μμ±λ κ°μ²΄μλ°μ€ν¬λ¦½νΈμμλ
Object
μμ±μ ν¨μ μ΄μΈμλString, Number, Boolean, Function, Array, Date, RegExp, Promise
λ±μλΉλμΈ(built-in)
μμ±μ ν¨μλ₯Ό μ 곡
β
17.2 μμ±μ ν¨μ
κ°μ²΄ 리ν°λ΄({}
)μ μν κ°μ²΄ μμ± λ°©μμ λ¬Έμ μ
{}
)μ μν κ°μ²΄ μμ± λ°©μμ λ¬Έμ μ κ°μ²΄ 리ν°λ΄μ μν κ°μ²΄ μμ± λ°©μμ μ§κ΄μ μ΄κ³ κ°νΈνμ§λ§, λ¨ νλμ κ°μ²΄λ§ μμ±νλ€λ λ¬Έμ κ° μλ€.
const circle1 = {
radius: 5,
getDiameter() {
return 2 * this.radius;
},
};
const circle2 = {
radius: 10,
getDiameter() {
return 2 * this.radius;
},
};
console.log(circle1.getDiameter()); //10
console.log(circle2.getDiameter()); //20
κ°μ²΄λ λ€μ 2κ°μ§λ₯Ό ννν μ μλ€.
νλ‘νΌν°
λ₯Ό ν΅ν΄ κ°μ²΄ κ³ μ μ **μν(state)**λ₯Ό ννλ©μλ
λ₯Ό ν΅ν΄ μν λ°μ΄ν°μΈ νλ‘νΌν°λ₯Ό μ°Έμ‘°νκ³ μ‘°μνλ **λμ(behavior)**μ νν
μν(state)μ κ²½μ°λ κ°μ²΄λ§λ€ λ€λ₯Έ κ°μ κ°μ§ μ μμ§λ§, λ©μλ(behavior)μ κ²½μ°λ λ΄μ©μ΄ λμΌν κ²½μ°κ° μΌλ°μ μ΄λ€.
νμ§λ§, κ°μ²΄ 리ν°λ΄λ‘ κ°μ²΄λ₯Ό νννλ κ²½μ°, νλ‘νΌν°μ κ΅¬μ‘°κ° λμΌν¨μλ λΆκ΅¬νκ³ , λ§€λ² κ°μ νλ‘νΌν°μ λ©μλλ₯Ό κΈ°μ ν΄μΌνλ€.
μμ±μ ν¨μμ μν κ°μ²΄ μμ± λ°©μμ μ₯μ
κ°μ²΄λ₯Ό μμ±νκΈ° μν ν νλ¦Ώ(ν΄λμ€)μ²λΌ μμ±μ ν¨μλ₯Ό μ¬μ©νμ¬ νλ‘νΌν° κ΅¬μ‘°κ° λμΌν κ°μ²΄ μ¬λ¬κ°λ₯Ό κ°νΈνκ² μμ±ν μ μλ€.
// μμ±μ ν¨μ
function Circle(radius) {
this.radius = radius;
this.getDiameter = function () {
return 2 * this.radius;
};
}
// μΈμ€ν΄μ€ μμ±
const circle1 = new Circle(5);
const circle2 = new Circle(10);
console.log(circle1.getDiameter()); //10
console.log(circle2.getDiameter()); //20
// new μ°μ°μμ ν¨κ» νΈμΆνμ§ μμ κ²½μ°, μΌλ° ν¨μλ‘ λμ
const circle3 = Circle(15);
console.log(circle3); // undefined
console.log(radius); // 15
μ°Έκ³ λ‘,
this
λ κ°μ²΄ μμ μ νλ‘νΌν°λ λ©μλλ₯Ό μ°Έμ‘°νκΈ° μν μκΈ° μ°Έμ‘° λ³μ(self-referencing varaible)λ‘, thisκ° κ°λ¦¬ν€λ κ°(this λ°μΈλ©)μ ν¨μ νΈμΆ λ°©μμ λ°λΌ λμ μΌλ‘ κ²°μ λλ€.μμ±μ ν¨μ λ΄λΆμ thisλ μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν¨λ€.
μλ°μ€ν¬λ¦½νΈμμμ μμ±μ ν¨μ
μλ°μ κ°μ ν΄λμ€ κΈ°λ° κ°μ²΄μ§ν₯μΈμ΄μ μμ±μμλ λ€λ₯΄κ², μλ°μ€ν¬λ¦½νΈμ μμ±μλ νμμ΄ μ ν΄μ Έμμ§ μλ€.
μΌλ° ν¨μμ λμΌν λ°©λ²μΌλ‘ μμ±μ ν¨μλ₯Ό μ μνκ³
new μ°μ°μμ ν¨κ» νΈμΆνλ©΄ ν΄λΉ ν¨μλ μμ±μ ν¨μλ‘ λμνλ€.
λ°λΌμ, λ§μ½ new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ₯Ό νΈμΆνμ§ μμΌλ©΄, μΌλ° ν¨μλ‘ λμνλ€.
new.target
μΌλ° ν¨μμ μμ±μ ν¨μμ νμ μ°¨μ΄λ μμ§λ§, new
μ°μ°μμ ν¨κ» ν¨μλ₯Ό νΈμΆνλ©΄, ν΄λΉ ν¨μλ μμ±μ ν¨μλ‘ λμνλ€.
**new.target
**μ΄λ, ES6μ λμ
λμ΄ new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ‘μ νΈμΆλμλμ§ νμΈν μ μλ λ¬Έλ²μ΄λ€.
new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ‘μ νΈμΆλλ©΄ : ν¨μ λ΄λΆμ new.targetμ
ν¨μ μμ
μ κ°λ¦¬ν¨λ€.new μ°μ°μμ μμ΄ μΌλ° ν¨μλ‘μ νΈμΆλλ©΄ : ν¨μ λ΄λΆμ new.targetμ
undefined
λ₯Ό κ°λ¦¬ν¨λ€.
// μμ±μ ν¨μ
function Circle(radius) {
// μ΄ ν¨μκ° new μ°μ°μμ ν¨κ» νΈμΆλμ§ μμλ€λ©΄, new.targetμ undefined
if (!new.target) {
return new Circle(radius);
}
this.radius = radius;
this.getDiameter = function () {
return 2 * this.radius;
};
}
// new μ°μ°μ μμ΄ μμ±μ νΈμΆνμ¬λ new.targetμ ν΅ν΄ μμ±μ ν¨μλ‘μ νΈμΆλλ€.
const circle = Circle(10);
console.log(circle); // Circle { radius: 10, getDiameter: [Function (anonymous)]
μ€μ½ν μΈμ΄ν μμ±μ ν¨ν΄
IE μ κ°μ΄ new.targetμ μ§μνμ§ μλ λΈλΌμ°μ νκ²½μμ, μμ±μ ν¨μλ₯Ό 보μ₯νλ λ°©λ²μ΄λ€.
// μμ±μ ν¨μ
function Circle(radius) {
// μ΄ ν¨μκ° new μ°μ°μμ ν¨κ» νΈμΆλμ§ μμλ€λ©΄, μ΄ μμ μ thisλ μ μ κ°μ²΄ windowλ₯Ό κ°λ¦¬ν΄
// μ¦, this λ Circleκ³Ό νλ‘ν νμ
μ μν΄ μ°κ²°λμ§ μλλ€.
if (!(this instanceof Circle)) {
return new Circle(radius);
}
this.radius = radius;
this.getDiameter = function () {
return 2 * this.radius;
};
}
// new μ°μ°μ μμ΄ μμ±μ νΈμΆνμ¬λ μμ±μ ν¨μλ‘μ νΈμΆλλ€.
const circle = Circle(10);
console.log(circle); // Circle { radius: 10, getDiameter: [Function (anonymous)]
μ€μ½ν μΈμ΄ν μμ±μ ν¨ν΄μ λλΆλΆμ λΉνΈμΈ μμ±μ ν¨μμ λν΄μλ μ μ©λμ΄, new μ°μ°μμ ν¨κ» νΈμΆλμλμ§λ₯Ό νμΈ ν μ μ ν κ°μ λ°νμν¨λ€.
λ¨, μμνμ μ λΉνΈμΈ μμ±μ ν¨μ(
Number, String, Boolean
) μ λν΄μλ μ΄λ₯Ό 보μ₯νμ§ μκ³ , μμ κ°μ λ°ννκΈ°λ νλ€.
// **Object, Function** : new μμ±μ μμ΄ νΈμΆν΄λ new μ°μ°μμ ν¨κ» νΈμΆνμ λμ λμΌνκ² λμ
const obj = Object();
console.log(obj); //{}
// **Number, String, Boolean** : new μ°μ°μ μμ΄ νΈμΆνλ©΄ μμ κ° λ°ν
const num = Number("123");
console.log(num, typeof num); // 123 number
β
17.3 μμ±μ ν¨μμ μΈμ€ν΄μ€ μμ± κ³Όμ
λ¨Όμ μμ±μ ν¨μμ μν μ λ€μκ³Ό κ°λ€.
[νμ] νλ‘νΌν° κ΅¬μ‘°κ° λμΌν μΈμ€ν΄μ€λ₯Ό μμ±νκΈ° μν ν νλ¦Ώ(ν΄λμ€)λ‘μ λμνμ¬ μΈμ€ν΄μ€λ₯Ό μμ±
[μ΅μ ] μμ±λ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ν(μΈμ€ν΄μ€ νλ‘νΌν° μΆκ° λ° μ΄κΈ°κ° ν λΉ)
new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ₯Ό νΈμΆνλ©΄, μλ°μ€ν¬λ¦½νΈ μμ§μ λ€μκ³Ό κ°μ κ³Όμ μ κ±°μ³ μ묡μ μΌλ‘ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°νν ν μ묡μ μΌλ‘ μΈμ€ν΄μ€λ₯Ό λ°ννλ€.
1οΈβ£ μΈμ€ν΄μ€ μμ±κ³Ό this λ°μΈλ©
λ°νμ μ΄μ μ μ묡μ μΌλ‘ λΉ κ°μ²΄κ° μμ±λλ€.
λΉ κ°μ²΄ : μμ§μ λ―Έμμ±λ μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€
μ΄ λΉ κ°μ²΄(μΈμ€ν΄μ€)λ thisμ λ°μΈλ©λλ€.
λ°λΌμ, μμ±μ ν¨μ λ΄λΆμ thisκ° μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν΄
// μμ±μ ν¨μ
function Circle(radius) {
// 1οΈβ£ μ묡μ μΌλ‘ μΈμ€ν΄μ€κ° μμ±λκ³ thisμ λ°μΈλ©λλ€.
console.log(this); // Circle {}
this.radius = radius;
this.getDiameter = function () {
return 2 * this.radius;
};
}
π§ λ°μΈλ©μ΄λ?
μλ³μμ κ°μ μ°κ²°νλ κ³Όμ
λ³μ μ μΈ : λ³μ μ΄λ¦(μλ³μ)μ ν보λ λ©λͺ¨λ¦¬ 곡κ°μ μ£Όμλ₯Ό λ°μΈλ©νλ κ²
this λ°μΈλ© : thisμ thisκ° κ°λ¦¬ν¬ κ°μ²΄λ₯Ό λ°μΈλ©
2οΈβ£ μΈμ€ν΄μ€ μ΄κΈ°ν
μμ±μ λͺΈμ²΄μ κΈ°μ λμ΄ μλ μ½λκ° ν μ€μ© μ€νλλ©°, thisμ λ°μΈλ©λμ΄ μλ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ννλ€.
thisμ λ°μΈλ©λμ΄ μλ μΈμ€ν΄μ€μ νλ‘νΌν°λ λ©μλλ₯Ό μΆκ°νκ³
μμ±μ ν¨μκ° μΈμλ‘ μ λ¬λ°μ μ΄κΈ°κ°μ μΈμ€ν΄μ€ νλ‘νΌν°μ ν λΉνμ¬ μ΄κΈ°ννκ±°λ κ³ μ κ° ν λΉ
// μμ±μ ν¨μ
function Circle(radius) {
// 1οΈβ£ μ묡μ μΌλ‘ μΈμ€ν΄μ€κ° μμ±λκ³ thisμ λ°μΈλ©λλ€.
// 2οΈβ£ thisμ λ°μΈλ© λμ΄ μλ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ννλ€.
this.radius = radius;
this.getDiameter = function () {
return 2 * this.radius;
};
}
3οΈβ£ μΈμ€ν΄μ€ λ°ν
μμ±μ ν¨μ λ΄λΆμμ λͺ¨λ μ²λ¦¬κ° λλλ©΄, μμ±λ μΈμ€ν΄μ€κ° λ°μΈλ©λ thisλ₯Ό μ묡μ μΌλ‘ λ°ννλ€.
// μμ±μ ν¨μ
function Circle(radius) {
// 1οΈβ£ μ묡μ μΌλ‘ μΈμ€ν΄μ€κ° μμ±λκ³ thisμ λ°μΈλ©λλ€.
// 2οΈβ£ thisμ λ°μΈλ© λμ΄ μλ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ννλ€.
this.radius = radius;
this.getDiameter = function () {
return 2 * this.radius;
};
// 3οΈβ£ μμ±λ μΈμ€ν΄μ€κ° λ°μΈλ©λ this(= μΈμ€ν΄μ€)κ° μ묡μ μΌλ‘ λ°νλλ€.
}
// μΈμ€ν΄μ€λ₯Ό μμ±, Circle μμ±μ ν¨μλ μ묡μ μΌλ‘ this(Circle μΈμ€ν΄μ€)λ₯Ό λ°ννλ€.
const circle = new Circle(10);
console.log(circle); // Circle { radius: 10, getDiameter: [Function (anonymous)]
λ§μ½ μ묡μ μΌλ‘ thisλ₯Ό λ°ννλ λμ ,
λ€λ₯Έ κ°μ²΄λ₯Ό λͺ μμ μΌλ‘ λ°νν κ²½μ°, returnλ¬Έμ λͺ μν κ°μ²΄κ° λ°νλλ€.
λν λͺ μμ μΌλ‘ μμ κ°μ λ°ννλ©΄, μμ κ° λ°νμ 무μλκ³ μ묡μ μΌλ‘ thisκ° λ°νλλ€.
// μμ±μ ν¨μ
function Circle(radius) {
this.radius = radius;
this.getDiameter = function () {
return 2 * this.radius;
};
return 100; // βλͺ
μμ μΌλ‘ μμ κ°μ λ°ννλ©΄, μμ κ° λ°νμ 무μλκ³ μ묡μ μΌλ‘ this λ°ν
}
// μΈμ€ν΄μ€λ₯Ό μμ±
const circle = new Circle(10);
console.log(circle); // Circle { radius: 10, getDiameter: [Function (anonymous)
Last updated