Prototypes in Javascript
μλ°μ€ν¬λ¦½νΈ μΈκ³μ κ°μ‘± κ΄κ³λλ₯Ό μμλ³΄κ² λ€. π¨βπ©βπ§βπ¦ (μ€μ?)
ν€μλλ
prototype (μλΉ )
constructor (μλ§)
instance (μμ)
μ΄ λ κ²μ΄λ€.
Prototype
μ΄λΌλ λ¨μ΄κ° λ»νλ μλ―Έλ μμ΄μ μΈ νν
, μλμνν
λ₯Ό λ§νλ€.
Constructor
μμ±μν¨μ new ν€μλμ ν¨κ» μ°μ΄λ ν¨μλ₯Ό λ§νλ€.
you don't konw js μ± μμμ μ μλ μ°Ύμ보μ
μλ°μ€ν¬λ¦½νΈμ μμ±μλ μμ new μ°μ°μκ° μμ λ νΈμΆλλ μΌλ° ν¨μμ λΆκ³Όνλ€. ν΄λμ€μ λΆμ κ²λ μλκ³ ν΄λμ€ μΈμ€ν΄μ€ν κΈ°λ₯λ μλ€. μ¬μ§μ΄ νΉλ³ν ννμ ν¨μλ μλλ€. λ¨μ§ newλ₯Ό μ¬μ©νμ¬ νΈμΆν λ μλμΌλ‘ λΆλ€λ € μ€νλλ κ·Έμ νλ²ν ν¨μλ€.
15.7.2 Number μμ±μ(ES5.1λͺ μΈ) new ννμμ μΌλΆλ‘ νΈμΆ μ Numberλ μμ±μμ΄λ©° μλ‘ λ§λ€μ΄μ§ κ°μ²΄λ₯Ό μ΄κΈ°ννλ€.
newλ₯Ό λΆμ¬μ νΈμΆ ν μ μκ³ μ΄λ κ²°κ΅
μμ±μ νΈμΆ
μ΄λ λ€λ¦μλ€. μμ±μ ν¨μκ° μλλΌν¨μλ₯Ό μμ±νλ νΈμΆ
μ΄λΌκ³ ν΄μΌ μ³λ€.
μ¬κΈ°μ μ£Όλͺ©νκ² λλ ν€μλλ€μ΄ μλ€. μλ‘ λ§λ€μ΄μ§ κ°μ²΄λ₯Ό μ΄κΈ°ν
νλ€μ ν¨μλ₯Ό μμ±νλ νΈμΆ
μ΄ν΄κ° μ λλ ν€μλλ€!
λν μΆκ°λ‘ newλ₯Ό λΆμ¬ μμ±μ νΈμΆμ νλ©΄ μ΄λ€ μΌμ΄ μΌμ΄λλμ§ κ°λ΅νκ² μμ보μ.
μ κ°μ²΄κ° ν λ§λ€μ΄μ§λ€.
μλ‘ μμ±λ κ°μ²΄μ [[Prototype]]μ΄ μ°κ²°λλ€.
μλ‘ μμ±λ κ°μ²΄λ ν΄λΉ ν¨μ νΈμΆμ thisλ‘ λ°μΈλ© λλ€.
μ΄ ν¨μκ° μμ μ λ λ€λ₯Έ κ°μ²΄λ₯Ό λ°ννμ§ μλ ν newμ ν¨κ» νΈμΆλ ν¨μλ μλμΌλ‘ μλ‘ μμ±λ κ°μ²΄λ₯Ό λ°ννλ€.
new ν€μλμ ν¨κ» μ°μ΄λ ν¨μ
new Array(); - μ¬κΈ°μ μμ±μ ν¨μλ Array(); μ΄λ€.
new Object();
new Function();
νΉμ§μ΄ μλλ° ν¨μλͺ μ 첫κΈμλ λλ¬Έμλ₯Ό μ΄λ€.
μ°λ¦¬κ° μ§κΈ κΉμ§ μ΄λ κ² μ§μ μ μΌλ‘ μ°μ§ μμμ΄λ μ°νν΄μ μ¬μ©νμ κ²μ΄λ€.
λͺ¨λ μλ°μ€ν¬λ¦½νΈ κ°μ²΄λ μμ±μ ν¨μλ₯Ό ν΅ν΄μ λ§λ€μ΄ μ§κ²μ΄λ€!
λν μμ±μ ν¨μλ ν¨μμ΄κ³ -> ν¨μλ κ°μ²΄μ΄λ€. κ·Έλμ μμ±μν¨μλ -> κ°μ²΄μ΄λ€. ν¨μμΈλ° κ°μ²΄μ΄λ€? μ΄κ²μ΄ 무μ¨λ»μ΄λνλ©΄ μμ±μ ν¨μκ° κ°μ²΄μ νΉμ§μ κ°μ§ μ μλ€
λ κ²μ΄λ€. κ·Έ νΉμ§μ΄ 무μμΈμ§ μμ보μ.
κ°μ²΄μ νΉμ§ keyμ valueλ‘ μ΄λ£¨μ΄μ Έ μλ€. μμ±μ ν¨μλ Keyμ valueλ₯Ό κ°μ§ μ μλ€.
μμ±μ ν¨μμΈ Array() , Object(), Function()λ keyμ valueλ₯Ό κ°μ§ μ μλ€.
νμ§λ§ μ΄λ¬ν Array(), Object(), Function()μ 곡ν΅μ μΌλ‘ μ°μ΄λκ²μ΄κΈ° λλ¬Έμ λ°λ‘ keyμ valueλ λ§λ€μ§ μλκ² μ’λ€.
λν μμ±μ ν¨μλ μνλ©΄ μ°λ¦¬κ° λ§λ€ μ μλ€. μμ±μ ν¨μμΈμ§μ λν μ νν νλ¨μ μ°μμ λ°λΌ λ§λ μλλλ‘ λλ μ μλ€.
μ΄μ ν¨μμ prototypeμ κ΄κ³λ₯Ό μμ보μ.
ν¨μμ prototypeμ κ΄κ³ - λͺ¨λ ν¨μλ prototype μμ±μ΄ μλ€!
ν¨μλ₯Ό λ§λ€λ©΄ 무쑰건 prototypeμ΄λΌλ μμ±μ΄ κ»΄μλ€.
μ½μμ μ§μ μ°μ΄λ³Έλ€λ©΄ μμ±μ ν¨μκ° λ§λ μλλ ν¨μλͺ
.prototype
μΌλ‘ μ°μ΄λ³΄λ©΄ ν¨μλ prototypeμ΄λΌλ μμ±μ κ°μ§κ³ μκ³ κ°μΌλ‘λ {constructor: Ζ}
λ₯Ό νμΈ ν μ μλ€.
prototypeμ ν΄λΉλλ valueλ κ°μ²΄μμ νμΈ ν μ μλ€.
μμ¬ μ½λλ‘ μ€λͺ
νλ€λ©΄ Foo = { prototype: {} }
λ‘ μκ°ν μ μλ€.
prototypeμ valueλ‘ {}
κ°μ²΄λ₯Ό κ°μ§κ³ μμΌλ©°, κ·Έ κ°μ²΄λ€μ μλμ μΌλ‘ keyμ valueκ° μ€μ λμ΄μ Έ μλ€. λν constructorμ valueλ μκΈ°μμ Foo()λ‘ μ€μ λμ΄ μλ κ²μ νμΈ ν μ μλ€.
Constructλ .prototype μμ±μ κ°μ§κ³ .prototypeμ Prototypeμ΄λΌκ³ λΆλ¦¬λ κ°μ²΄λ₯Ό κ°μ§κ³ μλ€.
μμ±μ ν¨μλ₯Ό λ§λ€μλ€!(λͺ¨λ ν¨μ λ€ ν¬ν¨μ΄ κ°λ₯νλ€)
μμ±μ ν¨μλ μλμΌλ‘
prototype
μ΄λΌλ μμ±μ κ°μ§κ² λλ€.μ΄
prototype μμ±
μ΄ κ°κ³ μλ valueλ μ΄λ€ νλμprototypeμ΄λΌλ λΆλ₯΄λ κ°μ²΄
μ΄λ€.
Prototypeμ΄λΌκ³ λΆλ¦¬λ κ°μ²΄μλ νμ λ°λμ .constructλΌλ μμ±μ κ°μ§λ€.
consoleλ‘ νμΈν΄λ³΄μ
ObjectλΌλ μμ±μ ν¨μκ° μλ€.
μ΄ ObjectλΌλ μμ±μ ν¨μμλ .prototypeμ΄λΌλ μμ±μ κ°μ§κ³ μκ³ μ΄ .prototypeμ Prototypeμ΄λΌλ κ°μ²΄λ₯Ό κ°μ§κ³ μλ€.
prototypeμ΄λΌλ κ°μ²΄μλ constructorλΌλ μμ±μ΄ μλλ° κ·Έ μμ±μ μμ±μν¨μλ₯Ό κ°λ¦¬ν¨λ€.
constuctorμμ±μ constructorλ₯Ό κ°λ¦¬ν¨λ€.
constructλ λ prototypeμ΄λΌλ μμ±μ κ°μ§λ€.
μ 리νμλ©΄
Constructorλ .prototyeμ΄λΌλ μμ±μ κ°μ§λ€.
.prototypeμμ±μ Prototypeμ΄λΌλ κ°μ²΄λ₯Ό κ°μ§λ€.
Prototypeκ°μ²΄λ .constructorλΌλ μμ±μ κ°μ§κ² λλ€.
.constructorλΌλ μμ±μ Constructorλ₯Ό κ°λ¦¬ν€κ² λλ€.
Constructorλ λ€μ .prototypeμ΄λΌλ μμ±μ κ°μ§κ² λλ€.
μ΄λ‘μ¨ Constroctorμ Prototypeμ .prototypeκ³Ό .constructor μμ±μ κ°μ§κ³ κ·Έ μμ±μ prototypeμ΄λΌλ κ°μ²΄μ Constructorλ₯Ό κ°λ¦¬ν€κΈ° λλ¬Έμ μλ‘κ° μλ‘λ₯Ό κ°λ¦¬ν€κ² λλ€.
λ¨νΈκ³Ό μλ΄λ‘ λΉμ ν΄ λ³΄μ π
constructorκ° λ¨νΈμ΄ λκ³ prototypeμ μλ΄κ° λλ€. κ·Έλ¦Όκ³Ό κ°μ΄ λ¨νΈκ³Ό μλ΄λ₯Ό λΆλ₯΄λ λ°©λ²μ λΉ¨κ° νμ΄νλλ‘ λΆλ₯Ό μ μλ€κ³ μκ°νλ©΄ μ’λ μ½λ€!
πμ€μ λ‘ μμ μ ν λμ μ°μ§ μλλ€.
Instance π¨βπ©βπ§βπ¦
(νκ°μ§μ) κ²½μ°
newλ₯Ό ν΅ν΄ μμ±μν¨μλ₯Ό νΈμΆ νλ©΄ κ°μ²΄λ₯Ό 리ν΄ν΄μ€λ€. μμ±μν¨μλ 무쑰건 thisλ₯Ό returnν΄μ£Όκ³ thisλ κ°μ²΄μ΄λ€.
new Object()λ₯Ό ν κ²°κ³Όλ¬Όμ μΈμ€ν΄μ€λΌκ³ λΆλ₯Έλ€.
λλ₯
new Foo();
λΌλ κ²μ μΈμ€ν΄μ€λ₯Ό λ§λλ κ²μΈλ° μ΄κ²μ Fooμ μΈμ€ν΄μ€
λΌκ³ λ§νλ€.
μμ λμ€μ΄ λκ°λ€κ³ λ§ ν μμλ€. νμ§λ§ aμ bλ κ°λ€κ³ ν μ μλ€.
λ°©κΈμ λ¨νΈκ³Ό μλ΄μ λΉμ λ₯Ό νμλλ° instanceλ λ¨νΈκ³Ό μλ΄μ κ²°κ³Όλ¬Όμ΄λΌκ³ μκ°ν΄λ³΄μ.
μ¬κΈ°μ λ¨νΈμ? Objectκ° λλ€.
μ¬κΈ°μ μλ΄λ? Object.prtotypeμ΄ λλ€.
fλ μ κΈ°λ€.
Fooκ° μλΉ κ° λλ€.
Foo.prtotypeμ΄ μλ§κ° λλ€.
Prototype chain! π©βπ§
λ¨νΈ
λ¨νΈμ μλ΄
κ·Όλ° μμμ΄? constructorλ₯Ό μ¬μ© ν μ μλ€?
.constructorλ μλ§ μ¦ Prototypeμ΄ κ°μ§λ μμ±μ΄ μλ€.
objμκ² μ무κ²λ ν λΉνμ§ μμλλ° constructorλ₯Ό κ°μ§ μ μλ μν©μ΄λ€.
μ΄κ² 무μ¨μΌμ΄λ???! μμμ΄ μλ§μ 물건μ μ¬μ©ν μν©μ΄λ€.
μμμ μΌλ¨ μμ μ΄ κ°μ§κ³ μλμ§ νμΈν ν! 체ν¬μ²΄ν¬ -> μλ€λ©΄ μλ§κ» μ¬μ© νλ€.
objμκ² hahaλ₯Ό λ§λ€μ΄ μ£Όμ§ μμλλ°! hahaλ₯Ό κ°μ§! π©βπ§
μΈμ€ν΄μ€(μμ)λ μμ μ΄ λκ°λ₯Ό νμλ‘ ν λ λ¨Όμ μμ¬κ» μμ μ΄ κ°μ§κ³ μλμ§ νμΈ ν ν μλ€λ©΄ prototype(μλ§)μμ μ°Ύλλ€.
κ·Έλ¦ΌμΌλ‘ νμΈνλ€λ©΄
Dunder Proto
proto μ΄λ κ² μκΈ΄κ±Έ Dunder ProtoλΌκ³ νλ€.
λ§μ§λ§ 2μ€μ μμΈν μ΄ν΄λ³΄μ.
kennimμλ constructorλΌλ μμ±μ΄ μλ€. κ·Έλ κΈ° λλ¬Έμ μλ§μΈ prototypeμμ μ΄ν΄λ³Ό κ²μ΄κ³ , prototypeμ .constructorλΌλκ±Έ κ°μ§κ³ μλ€. μ΄ .constructλ μλΉ λ₯Ό λ°λΌλ³Έλ€. μλΉ λ Constructorκ³ κ·Έκ²μ Personμ΄κΈ° λλ¬Έμ true
λ€!
μκΉ μμμ λ΄€λ―μ΄ Dunder protoλ Prototypeμ΄ κ°μ§ μ 보λ₯Ό κ°μ§κ³ μμλ€. κ·Έλ κΈ° λλ¬Έμ true
o μΈμ€ν΄μ€
μμμ΄ κ°μ§ constructorλ₯Ό κ°μ₯ λ¨Όμ μ°Ύλλ° κ·Έκ²μ bar function μ΄κΈ° λλ¬Έμ falseκ° λλ€.
μμμ΄ μλ§μκ² μ κ·Όνκ³ μ ν λ Dunder protoλ‘ ν μ μκΈ΄ νλ€. νμ§λ§ νλ©΄ μλλ€.
μ κ±Έ μ°μ¬μΌ νλ μν©μ μ½λκ° μ λλ‘ μ§μ¬μμ§ μλ€λ κ²μ΄κΈ° λλ¬Έμ κ·Έ μ€λ₯λ₯Ό ν΄κ²°ν΄μΌμ§ μ κ·Όνλ©΄ μλλ€.
μλ§μλΉ λ μλ§μλΉ κ° μλ€.
Foo.prototype μμ μλ§λ λκ΅΄κΉ?**
Foo.prototype
λν κ°μ²΄ instanceλ€. keyμ valueλ₯Ό κ°μ‘λ€. μλΉ λ μμ±μ ν¨μλ€ Foo.prototype
μ μλΉ λ λꡬμΌκΉ?
μμκ²λ μλ§μ μ 보λ₯Ό κ°μ§ __proto__
κ° μλ€.
μ κΉ Object.prototypeμ νμΈνμ.
μ΄λ¬ν μ΄μ λ Foo.prototype
λ new Object();
λ‘ λ§λ€μ΄μ§ νλμ intance
μ΄κΈ° λλ¬Έμ΄λ€.
Foo.prototype.proto === Object.prototype;
κ·Έλ κΈ° λλ¬Έμ μλ§μ μλ§μ μ λ³΄μΈ Foo.prototype. proto μ Objectμ μλ΄μΈ Object.prototypeκ³Ό λμΌνλ€λ κ²°κ³Όλ₯Ό μ»μ μ μλ€. π€
λ¨νΈμ Foo
λ¨νΈμ μλ΄λ Foo.prototype
λ¨νΈμ μλ΄μ μλ§μ μ 보λ Foo.prototype. proto λ‘ μ κ·Ό
λ¨νΈμ μλ΄μ μλ§λ μ€μ Object.prototype μ΄λ€. μν π€§
κ·ΈλΌ Objectμ μλ΄μ μλ§λ λκ΅΄κΉ?
μμ€ν μ null, Objectμ μλ΄λ..μ₯κ³Ό λ§λμ..λ¨Ή...(..)
κ°μ‘±κ΄κ³λ₯Ό μ§μ νμΈν΄λ³΄μ
κ°μ‘±κ΄κ³νμ μ΄ λλλ λ€μ νλ² νμΈνκ³ μ νλ μκ΅¬κ° μκ²Όλ€.
prototype chainμ μ΅μ’ ObjectκΉμ§ μ¬λΌκ°λ€
Inheritance(μμ)μ΄ μλλΌ Behavior Delegation(νλμ μμ, λ리)μ΄λ€.
νμν λλ§λ€ λΆνμ νλκ²μ΄μ§ μμ λ°μκ² μλλ€.
Last updated
Was this helpful?