6. κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°
μ΄ κΈμ κ³ νμ€, μ‘νμ£Ό λμ μΈμ¬μ΄λ μλ°μ€ν¬λ¦½νΈλ₯Όμ°Έμ‘°νμ¬ μμ±ν κΈμ λλ€.
#
ν΄λμ€ κΈ°λ° μΈμ΄ vs νλ‘ν νμ κΈ°λ° μΈμ΄λ¨Όμ ν΄λμ€λ κ°μ μ’
λ₯μ μ§λ¨μ μνλ μμ±(attribute)κ³Ό νμ(behavior)λ₯Ό μ μν κ²μΌλ‘, κ°μ²΄μ§ν₯ νλ‘κ·Έλ¨μ κΈ°λ³Έμ μΈ μ¬μ©μ μ μ λ°μ΄ν°νμ΄λΌκ³ ν μ μλ€. κ²°κ΅ ν΄λμ€λ κ°μ²΄ μμ±μ μ¬μ©λλ ν¨ν΄ νΉμ μ²μ¬μ§μΌ λΏμ΄λ©° new
μ°μ°μλ₯Ό ν΅νμΈμ€ν΄μ€ν κ³Όμ μ΄ νμνλ€.
μ΄λ¬ν ν΄λμ€ κΈ°λ° μΈμ΄λ λͺ¨λ μΈμ€ν΄μ€κ° ν΄λμ€μ μ μλ λλ‘ κ°μ ꡬ쑰μ΄κ³ , λ³΄ν΅ λ°νμμ κ·Έ ꡬ쑰λ₯Ό λ³κ²½ν μ μλ€. μ΄λ¬ν νΉμ±μ μ νμ±, μμ μ±, μμΈ‘μ± μΈ‘λ©΄μμ μ’μ§λ§, νλ‘ν νμ κΈ°λ°μ μΈμ΄λ λμ μΌλ‘ μμ λ‘κ² κ°μ²΄μ ꡬ쑰μ λμ λ°©μμ λ°κΏ μ μλ€λ μ₯μ μ΄ μλ€.
μλ°μ€ν¬λ¦½νΈλ ν΄λμ€ κ°λ μ΄ μκ³ λ³λμ κ°μ²΄ μμ± λ°©μμ΄ μ‘΄μ¬νλ€.
κ°μ²΄ 리ν°λ΄
Object()
μμ±μ ν¨μμμ±μ ν¨μ
μλ°μ€ν¬λ¦½νΈλ κ±°μ λͺ¨λ κ²μ΄ κ°μ²΄μ΄κ³ , ν¨μ κ°μ²΄λ‘ λ§μ κ²μ ꡬνν΄λ΄λλ°, ν΄λμ€, μμ±μ, λ©μλλ λͺ¨λ ν¨μλ‘ κ΅¬νμ΄ κ°λ₯νλ€.
function Person(name) { this.name = name;
this.getName = function () { return this.name; };
this.setName = function (value) { this.name = value; };}
var me = new Person('zzoon');console.log(me.getName()); // zzoon
me.setName('iamhjoo');console.log(me.getName()); // iamhjoo
μ¬κΈ°μ new
ν€μλλ‘ μλ‘μ΄ κ°μ²΄ me
λ₯Ό λ§λ λΆλΆμ μ£Όλͺ©νμ.
var me = new Person('zzoon');
μ΄ ννλ κΈ°μ‘΄ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ° μΈμ΄μμ ν ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±νλ μ½λμ λ§€μ° μ μ¬νλ€. ν¨μ Person
μ΄ ν΄λμ€μ΄μ μμ±μμ μν μ νλ κ²μ΄λ€.
μλ°μ€ν¬λ¦½νΈμμ ν΄λμ€ κΈ°λ°μ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ κΈ°λ³Έμ μΈ ννκ° μ΄μ κ°μμν΄λμ€ λ° μμ±μμ μν μ νλ ν¨μκ° μκ³ μ¬μ©μκ° new
ν€μλλ‘ μΈμ€ν΄μ€λ₯Ό μμ±νμ¬ μ¬μ©ν μ μλ€.
νμ§λ§ μ΄κ²μ λ¬Έμ κ° λ§μ μμ μ΄λ€. Person
μμ±μ ν¨μλ‘ μ¬λ¬ κ°μ²΄λ₯Ό λ§λ λ€κ³ ν΄λ³΄μ.
var me = new Person('me');var you = new Person('you');var him = new Person('him');
μ΄λ κ² μ¬μ©νλ κ²μ κ²μΌλ‘λ λ³ λ¬Έμ μμ΄ μλνμ§λ§, κ° κ°μ²΄λ μκΈ° μμμμ곡ν΅μ μΌλ‘ μ¬μ©ν μ μλ setName()
, getName()
ν¨μλ₯Ό λ°λ‘ μμ±νκ³ μμ΄μ, μ€λ³΅λλ μμμ λΆνμνκ² λ©λͺ¨λ¦¬μ μ¬λ €λκ³ μ¬μ©νκ³ μλ€.
μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²μ μλ°μ€ν¬λ¦½νΈμ νλ‘ν νμ κΈ°λ°μ κ°μ²΄μ§ν₯μ μ΄μ©νλ κ²μ΄λ€.
function Person(arg) { this.name = arg;}
Person.prototype.getName = function () { return this.name;};
Person.prototype.setName = function (value) { this.name = value;};
var me = new Person('me');var you = new Person('you');console.log(me.getName());console.log(you.getName());
μ΄ μμ μμλ Person
ν¨μ κ°μ²΄μ prototype
νλ‘νΌν°μ getName()
κ³Ό setName()
ν¨μλ₯Ό μ μνλ€. μ΄ Person
μΌλ‘ κ°μ²΄λ₯Ό μμ±νλ€λ©΄, κ° κ°μ²΄λ κ°μλ°λ‘ ν¨μ κ°μ²΄λ₯Ό μμ±ν νμ μμ΄ getName()
κ³Ό setName()
ν¨μλ₯Ό νλ‘ν νμ
체μΈμΌλ‘ μ κ·Όν μ μλ€.
μ΄λ κ² μλ°μ€ν¬λ¦½νΈμμ ν΄λμ€ μμ λ©μλλ₯Ό μ μν λλ νλ‘ν νμ
κ°μ²΄μ μ μν ν, new
λ‘ μμ±ν κ°μ²΄μμ μ κ·Όν μ μκ² νλ κ²μ΄ μ’λ€.
μλλ λκΈλΌμ€ ν¬λ½ν¬λκ° μ μν νλ‘ν νμ κ°μ²΄μ λ©μλλ₯Ό μΆκ°νλ λ°©μμ΄λ€.
Function.prototype.method = function (name, func) { if (!this.prototype[name]) { this.prototype[name] = func; }};
function Person(arg) { this.name = arg;}
Person.method('setName', function (value) { this.name = value;});
Person.method('getName', function () { return this.name;});
var me = new Person('me');var you = new Person('you');
console.log(me.getName()); // meconsole.log(you.getName()); // you
#
μμμλ°μ€ν¬λ¦½νΈλ ν΄λμ€λ₯Ό κΈ°λ°μΌλ‘ νλ μ ν΅μ μΈ μμμ μ§μνμ§λ μμ§λ§, κ°μ²΄ νλ‘ν νμ 체μΈμ μ΄μ©νμ¬ μμμ ꡬνν΄λΌ μ μλ€. μ΄λ¬ν μμμ ꡬν λ°©μμ ν¬κ²λ κ°μ§λ‘ ꡬλΆν μ μλλ°, νλλ ν΄λμ€ κΈ°λ° μΈμ΄μ μμ λ°©μμ νλ΄λ΄λ κ²(μμ¬ ν΄λμ€ ν¨ν΄ μμ, Pseudo-classical Inheritance)μ΄κ³ , λ λ²μ§Έλ νλ‘ν νμ μΌλ‘μμμ ꡬννλ κ²(νλ‘ν νμ ν¨ν΄ μμ, Prototypal Inheritance)μ΄λ€.
#
μμ¬ ν΄λμ€ ν¨ν΄ μμμμ¬ ν΄λμ€ ν¨ν΄μ μμ μμ±μ ν¨μμ prototype
νλ‘νΌν°λ₯Ό λΆλͺ¨ μμ±μ ν¨μμμΈμ€ν΄μ€λ‘ κ΅μ²΄νμ¬ μμμ ꡬννλ λ°©λ²μ΄λ€.
function Person(arg) { this.name = arg;}
Person.prototype.setName = function (value) { this.name = value;};
Person.prototype.getName = function () { return this.name;};
function Student(arg) {}
var you = new Person('iamhjoo');Student.prototype = you;
var me = new Student('zzoon');me.setName('zzoon');console.log(me.getName());
μ΄λ¬ν λ°©μμ λͺ κ°μ§ λ¬Έμ λ₯Ό κ°κ³ μλ€.
me
μΈμ€ν΄μ€λ₯Ό μμ±ν λ λΆλͺ¨ ν΄λμ€μΈPerson
μ μμ±μλ₯Ό νΈμΆνμ§ μλλ€.
μ΄ μ½λλ‘ me
μΈμ€ν΄μ€λ₯Ό μμ±ν λ 'zzoon'
μ λκ²ΌμΌλ μ΄λ₯Ό λ°μνλ μ½λκ°μμ΄μ setName()
λ©μλκ° νΈμΆλκ³ λμμΌ me
κ°μ²΄μ name
νλ‘νΌν°κ° λ§λ€μ΄μ§λ€.
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ Student
ν¨μμ λ€μ μ½λλ₯Ό μΆκ°νμ¬ λΆλͺ¨ ν΄λμ€μ μμ±μλ₯ΌνΈμΆν΄μΌ νλ€.
function Student(arg) { Person.apply(this, arguments);}
Student
ν¨μ μμμ μλ‘κ² μμ±λ κ°μ²΄λ₯Ό apply
ν¨μμ 첫 λ²μ§Έ μΈμλ‘ λ겨 Person
ν¨μλ₯Ό μ€νμν¨λ€.
new
μ°μ°μλ₯Ό ν΅ν΄ μΈμ€ν΄μ€λ₯Ό μμ±νλ€.
μμ±μ ν¨μ μ¬μ©μλ μνμ΄ μ‘΄μ¬νλλ° λ§μ½ μμ±μ ν¨μλ₯Ό νΈμΆν λ new
μ°μ°μλ₯Ό ν¬ν¨νλ κ²μ μκ² λλ©΄, this
κ° μλ‘μ΄ κ°μ²΄μ λ°μΈλ©λμ§ μκ³ μ μ κ°μ²΄μλ°μΈλ©λλ€.
- μμ±μ λ§ν¬μ νκ΄΄
μ μμ μμ Student
κ°μ²΄μ νλ‘ν νμ
μ Person
μμ±μ ν¨μκ° μμ±ν you
κ°μ²΄μ΄λ€. νλ‘ν νμ
κ°μ²΄λ λ΄λΆ νλ‘νΌν°λ‘ constructor
λ₯Ό κ°μ§λ©°, μ΄λ μμ±μν¨μλ₯Ό κ°λ¦¬ν€λ λ°λ©΄ you
κ°μ²΄λ constructor
νλ‘νΌν°λ₯Ό κ°μ§κ³ μμ§ μκ³ , λ°λΌμ νλ‘ν νμ
체μΈμ μν΄ Person.prototype
μ constructor
μΈ Person
ν¨μλ₯Όκ°λ¦¬ν€κ² λλ€.
- κ°μ²΄λ¦¬ν°λ΄
μμ¬ ν΄λμ€ ν¨ν΄ μμμ κΈ°λ³Έμ μΌλ‘ μμ±μ ν¨μλ₯Ό μ΄μ©νκΈ° λλ¬Έμ κ°μ²΄λ¦¬ν°λ΄ ν¨ν΄μΌλ‘ μμ±ν κ°μ²΄μ μμμλ μ ν©νμ§ μλ€. μ΄λ κ°μ²΄λ¦¬ν°λ΄ ν¨ν΄μΌλ‘ μμ±ν κ°μ²΄μ μμ±μ ν¨μλ Object()
μ΄κ³ μ΄λ₯Ό λ³κ²½ν λ°©λ²μ΄ μκΈ° λλ¬Έμ΄λ€.
#
νλ‘ν νμ μ μ΄μ©ν μμνλ‘ν νμ
ν¨ν΄ μμμ Object.create
ν¨μλ₯Ό μ¬μ©νμ¬ κ°μ²΄μμ λ€λ₯Έ κ°μ²΄λ‘ μ§μ μμμ ꡬννλ λ°©μμ΄λ€. νλ‘ν νμ
ν¨ν΄ μμμ κ°λ
μ μΌλ‘ μμ¬ ν΄λμ€ ν¨ν΄ μμλ³΄λ€ κ°λ¨νλ©°, μμ¬ ν΄λμ€ ν¨ν΄μ λ¨μ μΈ new
μ°μ°μκ° νμμκ³ μμ±μ λ§ν¬λνκ΄΄λμ§ μμΌλ©° κ°μ²΄ 리ν°λ΄μλ μ¬μ©ν μ μλ€.