[JavaScript] 17. νλ‘ν νμ (1)
π λͺ¨λ μλ°μ€ν¬λ¦½νΈ κ΅μ¬) 19μ₯. νλ‘ν νμ
01. κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°
μλ°μ€ν¬λ¦½νΈλ νλ‘ν νμ κΈ°λ° κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ΄λ―λ‘, λ¨Όμ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ λν΄ μμλ³Ό νμκ° μλ€.
κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ μ¬λ¬ κ°μ λ 립μ λ¨μ, κ°μ²΄μ μ§ν©μΌλ‘ νλ‘κ·Έλ¨μ νννλ€.
μμ± : κ°μ²΄μ νΉμ§μ΄λ μ±μ§μ λνλ΄λ©°, μ΄λ₯Ό ν΅ν΄ ꡬλ³νκ³ μΈμ
-> νμν μμ±λ§ κ°μΆλ € νννλ κ²μ μΆμνλΌκ³ νλ€.
// μ΄λ¦κ³Ό μ£Όμ μμ±μ κ°λ κ°μ²΄
const person = {
name: 'Lee',
address: 'Seoul'
};
console.log(person); // {name: "Lee", address: "Seoul"}
κ°μ²΄λ μν λ°μ΄ν°μ λμμ νλμ λ Όλ¦¬μ μΈ λ¨μλ‘ λ¬Άμ 볡ν©μ μΈ μλ£κ΅¬μ‘°λΌκ³ ν μ μλλ°,
μ¬κΈ°μ μν λ°μ΄ν°λ νλ‘νΌν°, λμμ λ©μλλΌκ³ λΆλ₯Έλ€.
const circle = {
radius: 5, // λ°μ§λ¦(μν λ°μ΄ν° = νλ‘νΌν°)
// μμ μ§λ¦: 2r (λμ = λ©μλ)
getDiameter() {
return 2 * this.radius;
}
};
console.log(circle.getDiameter()); // 10
02. μμκ³Ό νλ‘ν νμ
νλ‘ν νμ μ λͺ©μ μ μ½λμ λΆνμν μ€λ³΅μ μ κ±°νκΈ° μν¨μ΄λ€.
μμμ ν΅ν΄ μμ±μ ν¨μκ° μμ±ν λͺ¨λ μΈμ€ν΄μ€λ μμ(λΆλͺ¨) κ°μ²΄μΈ νλ‘ν νμ μ μμ°μ 곡μ νμ¬ μ¬μ©ν μ μλ€.
π‘ νλ‘ν νμ μ μμ± λ°°κ²½μ λ¨Όμ μμ보μ.
μμ±μ ν¨μ
λμΌν νλ‘νΌν°(λ©μλ ν¬ν¨) ꡬ쑰λ₯Ό κ°λ κ°μ²΄λ₯Ό μ¬λ¬ κ° μμ±ν λ μ μ©νλ€.
π₯ λ¬Έμ μ
μμ±μ ν¨μκ° μμ±νλ κ°μ²΄μμμ λ©μλλ, λͺ¨λ μΈμ€ν΄μ€κ° λμΌν λ΄μ©μ λ©μλλ₯Ό μ¬μ©ν λ νλλ§ μμ±ν΄μ 곡μ νμ¬ μ¬μ©νλ©΄ λ°λμ§νμ§λ§ κ·Έλ μ§ X
μΈμ€ν΄μ€λ₯Ό μμ±ν λλ§λ€ λ©μλλ₯Ό μ€λ³΅ μμ±
β‘οΈ μ΄λ¬ν λΆνμν μ€λ³΅μ μ κ±°νκΈ° μν΄, νλ‘ν νμ μ κΈ°λ°μΌλ‘ μμμ ꡬννλ€.
03. νλ‘ν νμ κ°μ²΄
νλ‘ν νμ κ°μ²΄λ κ°μ²΄ κ° μμμ ꡬννκΈ° μν΄ μ¬μ©λλ€.
β‘οΈ νλ‘ν νμ μ μμλ°μ νμ(μμ) κ°μ²΄λ μμ(λΆλͺ¨) κ°μ²΄μ νλ‘νΌν°(λ©μλ ν¬ν¨)λ₯Ό μμ μ νλ‘νΌν°μ²λΌ μμ λ‘κ² μ¬μ©ν μ μλ€.
1) __proto__ μ κ·Όμ νλ‘νΌν°
__proto__ λ μ κ·Όμ νλ‘νΌν°λ€.
__proto__ μ κ·Όμ νλ‘νΌν°λ μμ μ νλ‘ν νμ μ κ°μ μ μΌλ‘ μ κ·ΌνκΈ° μν νλ‘νΌν°λ€.
μ¦, [[Prototype]] λ΄λΆ μ¬λ‘―μ μ§μ μ κ·Όνμ§ λͺ»νκ³ , __proto__ μ κ·Όμ νλ‘νΌν°λ₯Ό ν΅ν΄ κ°μ μ μΌλ‘ μ κ·Όν μ μλ€λ κ²μ΄λ€.
1. __proto__ μ κ·Όμ νλ‘νΌν°λ₯Ό ν΅ν΄ νλ‘ν¬νμ μ μ κ·Όνλ©΄ -> __proto__ μ κ·Όμ νλ‘νΌν°μ getter ν¨μμΈ [[Get]]μ΄ νΈμΆ
2. __proto__ μ κ·Όμ νλ‘νΌν°λ₯Ό ν΅ν΄ μλ‘μ΄ νλ‘ν νμ μ ν λΉνλ©΄ -> __proto__ μ κ·Όμ νλ‘νΌν°μ setter ν¨μμΈ [[Set]]μ΄ νΈμΆ
__proto__ μ κ·Όμ νλ‘νΌν°λ μμμ ν΅ν΄ μ¬μ©λλ€.
β κ°μ²΄μ νλ‘νΌν°μ μ κ·Όνλ €κ³ ν λ, ν΄λΉ κ°μ²΄μ μ κ·Όνλ €λ νλ‘νΌν°κ° μλ€λ©΄
β‘οΈ __proto__ μ κ·Όμ νλ‘νΌν°κ° κ°λ¦¬ν€λ μ°Έμ‘°λ₯Ό λ°λΌ μμ μ λΆλͺ¨ μν μ νλ νλ‘ν νμ μ νλ‘νΌν°λ₯Ό μμ°¨μ μΌλ‘ κ²μνλ€.
μ΄λ¬ν νλ‘ν νμ μ 체μΈμ μ’ μ μ μ΅μμ κ°μ²΄μΈ Object.prototypeμ΄λ©°, μ΄ κ°μ²΄μ νλ‘νΌν°μ λ©μλλ λͺ¨λ κ°μ²΄μ μμλλ€.
__proto__ μ κ·Όμ νλ‘νΌν°λ₯Ό ν΅ν΄ νλ‘ν νμ μ μ κ·Όνλ μ΄μ
μνΈ μ°Έμ‘°μ μν΄ νλ‘ν νμ 체μΈμ΄ μμ±λλ κ²μ λ°©μ§νκΈ° μν΄μμ΄λ€.
π₯ μλ‘κ° μμ μ νλ‘ν νμ μ΄ λλ λΉμ μμ μΈ νλ‘ν νμ 체μΈμ΄ λ§λ€μ΄μ§ κ²½μ°, νλ‘νΌν°λ₯Ό κ²μν λ 무ν 루νμ λΉ μ§κ² λλ€.
β‘οΈ __proto__ μ κ·Όμ νλ‘νΌν°λ₯Ό ν΅ν΄ νλ‘ν νμ μ μ κ·Όνκ³ κ΅μ²΄νλλ‘ κ΅¬νλμ΄ μλ κ²μ΄λ€.
__proto__ μ κ·Όμ νλ‘νΌν°λ₯Ό μ½λ λ΄μ μ§μ μ¬μ©νλ κ²μ κΆμ₯νμ§ μλλ€.
λͺ¨λ κ°μ²΄κ° __proto__ μ κ·Όμ νλ‘νΌν°λ₯Ό μ¬μ©ν μ μλ κ²μ΄ μλκΈ° λλ¬Έμ΄λ€.
β κ·ΈλΌ μ΄λ»κ² β
νλ‘ν νμ μ μ°Έμ‘° μ·¨λ : __proto__ μ κ·Όμ νλ‘νΌν° λμ , Object.getPrototypeOf λ©μλ μ¬μ©
νλ‘ν νμ κ΅μ²΄ : __proto__ μ κ·Όμ νλ‘νΌν° λμ , Object.setPrototypeOf λ©μλ μ¬μ©
2) ν¨μ κ°μ²΄μ prototype νλ‘νΌν°
ν¨μ κ°μ²΄λ§μ΄ μμ νλ prototype νλ‘νΌν°λ μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€μ νλ‘ν νμ μ κ°λ¦¬ν¨λ€.
μ¦, λͺ¨λ κ°μ²΄κ° κ°μ§κ³ μλ __proto__ μ κ·Όμ νλ‘νΌν°μ ν¨μ κ°μ²΄λ§μ΄ κ°μ§κ³ μλ prototype νλ‘νΌν°λ κ²°κ΅ λμΌν νλ‘ν νμ μ κ°λ¦¬ν€λ κ²μ΄λ€.
π₯ μ΄ νλ‘νΌν°λ₯Ό μ¬μ©νλ 주체λ λ€λ₯Έλ°,
__proto__ μ κ·Όμ νλ‘νΌν°μ μ¬μ© 주체 : λͺ¨λ κ°μ²΄
prototype νλ‘νΌν°μ μ¬μ© 주체 : μμ±μ ν¨μ
3) νλ‘ν νμ μ constructor νλ‘νΌν°μ μμ±μ ν¨μ
λͺ¨λ νλ‘ν νμ μ constructor νλ‘νΌν°λ₯Ό κ°λλ€.
β» constructor νλ‘νΌν° : prototype νλ‘νΌν°λ‘ μμ μ μ°Έμ‘°νκ³ μλ μμ±μ ν¨μλ₯Ό κ°λ¦¬ν¨λ€.
μ΄ μ°κ²°μ μμ±μ ν¨μκ° μμ±λ λ(ν¨μ κ°μ²΄κ° μμ±λ λ) μ΄λ£¨μ΄μ§λ€.
// μμ±μ ν¨μ
function Person(name) {
this.name = name;
}
const me = new Person('Lee');
// me κ°μ²΄μ μμ±μ ν¨μλ Personμ΄λ€.
console.log(me.constructor === Person); // true
1. Person μμ±μ ν¨μλ me κ°μ²΄λ₯Ό μμ±
2. me κ°μ²΄λ νλ‘ν νμ μ constructor νλ‘νΌν°λ₯Ό ν΅ν΄ μμ±μ ν¨μμ μ°κ²°
β‘οΈ me κ°μ²΄μλ constructor νλ‘νΌν°κ° μμ§λ§, me κ°μ²΄μ νλ‘ν νμ μΈ Person.prototypeμλ construct νλ‘νΌν°κ° μλ€.
04. 리ν°λ΄ νκΈ°λ²μ μν΄ μμ±λ κ°μ²΄μ μμ±μ ν¨μμ νλ‘ν νμ
리ν°λ΄ νκΈ°λ²μ μν΄ μμ±λ κ°μ²΄λ νλ‘ν νμ μ΄ μ‘΄μ¬νλ€.
β οΈ νμ§λ§, νλ‘ν νμ μ conscructor νλ‘νΌν°κ° κ°λ¦¬ν€λ μμ±μ ν¨μκ° -> κ°μ²΄λ₯Ό μμ±ν μμ±μ ν¨μλΌκ³ λ¨μ X
β οΈ κ°μ²΄ 리ν°λ΄μ μν΄ μμ±λ κ°μ²΄μ Object μμ±μ ν¨μλ‘ μμ±λλ κ°μ²΄κ° κ°λ€κ³ μ°©κ°ν μ μλ€.
1. κ°μ²΄ 리ν°λ΄μ΄ νκ°λ λ
μΆμ μ°μ OrdinaryObjectCreateλ₯Ό νΈμΆ -> λΉ κ°μ²΄ μμ± (λμΌ)
2. μΈλΆ λ΄μ© (λ€λ¦)
β‘οΈ λμ λ€λ₯΄μ§λ§, κ°μ²΄λ‘μ λμΌν νΉμ±μ κ°λλ€!
<리ν°λ΄ νκΈ°λ²μ μν΄ μμ±λ κ°μ²΄μ μμ±μ ν¨μμ νλ‘ν νμ >
리ν°λ΄ νκΈ°λ² | μμ±μ ν¨μ | νλ‘ν νμ |
κ°μ²΄ 리ν°λ΄ | Object | Object.prototype |
ν¨μ 리ν°λ΄ | Function | Funcion.prototype |
λ°°μ΄ λ¦¬ν°λ΄ | Array | Array.prototype |
μ κ· ννμ 리ν°λ΄ | RegExp | RegExp.prototype |
05. νλ‘ν νμ μ μμ± μμ
νλ‘ν νμ κ³Ό μμ±μ ν¨μλ μΈμ λ μμΌλ‘ μ‘΄μ¬νλ€.
β‘οΈ νλ‘ν νμ μ μμ±μ ν¨μκ° μμ±λλ μμ μ λλΆμ΄ μμ±λλ€.
1) μ¬μ©μ μ μ μμ±μ ν¨μμ νλ‘ν νμ μμ± μμ
μμ±μ ν¨μλ‘μ νΈμΆν μ μλ ν¨μ, μ¦ constructλ ν¨μ κ°μ²΄λ₯Ό μμ±νλ μμ μ νλ‘ν νμ λ λλΆμ΄ μμ±λλ€.
μμ±μ ν¨μλ‘μ νΈμΆν μ μλ ν¨μ, μ¦ non-constructλ νλ‘ν νμ μ΄ μμ±λμ§ μλλ€.
μμ±λ νλ‘ν νμ μ νλ‘ν νμ μ μΈμ λ Object.prototypeμ΄λ€.
2) λΉνΈμΈ μμ±μ ν¨μμ νλ‘ν νμ μμ± μμ
β λΉνΈμΈ μμ±μ ν¨μλ
Object, String, Number, Function, Array λ± ..
λΉνΈμΈ μμ±μ ν¨μκ° μμ±λλ μμ μ νλ‘ν νμ μ΄ μμ±λλ€.
μ΄λ, λͺ¨λ λΉνΈμΈ μμ±μ ν¨μλ μ μ κ°μ²΄κ° μμ±λλ μμ μ μμ±λλ€.
β‘οΈ μμ±λ νλ‘ν νμ μ λΉνΈμΈ μμ±μ ν¨μμ prototype νλ‘νΌν°μ λ°μΈλ©λλ€.
06. κ°μ²΄ μμ± λ°©μκ³Ό νλ‘ν νμ μ κ²°μ
κ°μ²΄λ μΆμ μ°μ°μ μν΄ μμ±λλλ°, μΆμ μ°μ°μ μμ μ΄ μμ±ν κ°μ²΄μ νλ‘ν νμ μ μΈμλ‘ μ λ¬λ°λλ€.
νλ‘ν νμ μ μΆμ μ°μ°μ μ λ¬λλ μΈμμ μν΄ κ²°μ λλ€.
<- μ΄ μΈμλ κ°μ²΄κ° μμ±λλ μμ μ κ°μ²΄ μμ± λ°©μμ μν΄ κ²°μ λλ€.
π 3κ°μ§ κ°μ²΄ μμ± λ°©μ(κ°μ²΄ 리ν°λ΄μ μν΄ μμ±, Object μμ±μ ν¨μμ μν΄ μμ±, μμ±μ ν¨μμ μν΄ μμ±)
1) κ°μ²΄ 리ν°λ΄μ μν΄ μμ±λ κ°μ²΄μ νλ‘ν νμ
κ°μ²΄ 리ν°λ΄μ μν΄ μμ±λλ κ°μ²΄μ νλ‘ν νμ μ Object.prototypeμ΄λ€.
β‘οΈ κ°μ²΄ 리ν°λ΄μ μν΄ μμ±λ κ°μ²΄λ Object.prototypeμ νλ‘νΌν°μ λ©μλλ₯Ό μμ νκ³ μμ§ μμ§λ§, μμ μ νλ‘ν νμ μΈ Object.prototype κ°μ²΄λ₯Ό μμλ°μκΈ° λλ¬Έμ Object.protytpeμ νλ‘νΌν°μ λ©μλλ₯Ό μμ μ μμ°μΈ κ²μ²λΌ μ¬μ©ν μ μλ€.
2) Object μμ±μ ν¨μμ μν΄ μμ±λ κ°μ²΄μ νλ‘ν νμ
Object μμ±μ ν¨μμ μν΄ μμ±λλ κ°μ²΄μ νλ‘ν νμ μ Object.prototypeμ΄λ€.
(κ°μ²΄ 리ν°λ΄μ μν΄ μμ±λ κ°μ²΄μ λμΌνλ€.)
π‘ κ°μ²΄ 리ν°λ΄ vs. Object μμ±μ ν¨μμ μν κ°μ²΄ μμ± λ°©μ
<νλ‘νΌν°λ₯Ό μΆκ°νλ λ°©μ>
κ°μ²΄ 리ν°λ΄ λ°©μ : κ°μ²΄ 리ν°λ΄ λ΄λΆμ νλ‘νΌν°λ₯Ό μΆκ°
Object μμ±μ ν¨μ λ°©μ : λΉ κ°μ²΄ μμ± -> νλ‘νΌν° μΆκ°
3) μμ±μ ν¨μμ μν΄ μμ±λ κ°μ²΄μ νλ‘ν νμ
μμ±μ ν¨μμ μν΄ μμ±λλ κ°μ²΄μ νλ‘ν νμ μ μμ±μ ν¨μμ prototype νλ‘νΌν°μ λ°μΈλ©λμ΄ μλ κ°μ²΄λ€.
λ€μν λΉνΈμΈ λ©μλλ₯Ό κ°κ³ μλ Object.prototype νλ‘ν νμ κ³Όλ λ¬λ¦¬,
μ¬μ©μ μ μ ν¨μμ λλΆμ΄ μμ±λλ μμ±μ ν¨μμ prototype νλ‘νΌν°μ λ°μΈλ©λμ΄ μλ κ°μ²΄μ νλ‘νΌν°λ construct λΏμ΄λ€. (μ΄λ κ² νννλκ² λ§λμ§..?)
νλ‘ν νμ μ κ°μ²΄μ΄λ―λ‘ -> νλ‘ν νμ μλ νλ‘νΌν°λ₯Ό μΆκ°/μμ ν μ μλ€.
π μ°Έκ³ μλ£