μ£Όλμ΄ κ°λ°μμ κ°μΈ κ³΅λΆ κ³Όμ μ κΈ°λ‘ν©λλ€.
μλ°μ€ν¬λ¦½νΈλ νλ‘ν νμ κΈ°λ°μΈμ΄λΌμ βμμβ κ°λ μ΄ μ‘΄μ¬νμ§ μμ§λ§, ES6μμ ν΄λμ€ λ¬Έλ²μ΄ μΆκ°λμλ€.
λ€λ§, ES6μ ν΄λμ€μμλ μΌμ λΆλΆ νλ‘ν νμ μ νμ©νκ³ μλ€λ μ μ°Έκ³ νμ.
:: ν΄λμ€μ μΈμ€ν΄μ€
ν΄λμ€λ, μ΄λ μ¬λ¬Όμ κ³΅ν΅ μμ±μ λͺ¨μ μ μν μΆμμ μΈ κ°λ .
μΈμ€ν΄μ€λ ν΄λμ€μ μμ±μ μ§λλ ꡬ체μ μΈ μ¬λ‘.
μμ ν΄λμ€(superclass)μ 쑰건μ μΆ©μ‘±νλ©΄μ λμ± κ΅¬μ²΄μ μΈ μ‘°κ±΄μ΄ μΆκ°λ κ²μ νμ ν΄λμ€(subclass)λΌκ³ νλ€
μλ°μ€ν¬λ¦½νΈμ ν΄λμ€
μλ°μ€ν¬λ¦½νΈλ νλ‘ν νμ κΈ°λ° μΈμ΄μ΄λ―λ‘ ν΄λμ€μ κ°λ μ΄ μ‘΄μ¬νμ§ μλλ€. κ·Έλ μ§λ§ νλ‘ν νμ μ μΌλ°μ μΈ μλ―Έμμμ ν΄λμ€ κ΄μ μμ μ κ·Όν΄λ³΄λ©΄ λΉμ·νκ² ν΄μν μλ μλ€.
μλ₯Ό λ€μ΄, μμ±μ ν¨μ Arrayλ₯Ό new
μ°μ°μμ ν¨κ» νΈμΆνλ©΄ μΈμ€ν΄μ€κ° μμ±λλ€. μ΄λ Arrayλ₯Ό μΌμ’
μ ν΄λμ€λΌκ³ νλ©΄, Arrayμ prototype κ°μ²΄ λ΄λΆ μμλ€μ΄ μΈμ€ν΄μ€μ μμλλ€κ³ λ³Ό μ μλ€.
μλ°νλ μμμ΄ μλ νλ‘ν νμ
체μ΄λμ μν μ°Έμ‘°μ§λ§, κ²°κ³Όμ μΌλ‘λ λμΌνκ² λμνλ―λ‘ μμμ΄λΌκ³ μ΄ν΄ν΄λ 무방νλ€.
ννΈ Array λ΄λΆ νλ‘νΌν°λ€ μ€ prototype νλ‘νΌν°λ₯Ό μ μΈν λλ¨Έμ§λ μΈμ€ν΄μ€μ μμλμ§ μλλ€.
μΈμ€ν΄μ€μ μμλλμ§ (μΈμ€ν΄μ€κ° μ°Έμ‘°νλμ§) μ¬λΆμ λ°λΌ static member
μ instance member
λ‘ λλλ€. μ΄ λΆλ₯λ λ€λ₯Έ μΈμ΄μ ν΄λμ€ κ΅¬μ±μμμ λν μ μλ₯Ό μ°¨μ©ν κ²μΌλ‘μ ν΄λμ€ μ
μ₯μμ μ¬μ© λμμ λ°λΌ ꡬλΆν κ²μ΄λ€.
μ°Έκ³ λ‘, μΈμ€ν΄μ€μμ μ§μ μ κ·Όν μ μλ λ©μλκ°
static member
μ΄λ€.static member
λ μμ±μ ν¨μλ₯Ό thisλ‘ ν΄μΌλ§ νΈμΆν μ μλ€.
κ·Έλ°λ° μλ°μ€ν¬λ¦½νΈμμλ μΈμ€ν΄μ€μμλ μ§μ λ©μλλ₯Ό μ μν μ μκΈ° λλ¬Έμ μΈμ€ν΄μ€ λ©μλ
λΌλ λͺ
μΉμ νΌλμ€λ¬μμ μΌκΈ°ν μ μλ€. (νλ‘ν νμ
μ μ μν λ©μλλ₯Ό μ§μΉνλ 건μ§, μΈμ€ν΄μ€μ μ μν λ©μλλ₯Ό μ§μΉνλ κ±΄μ§ λ±) λ°λΌμ μ λͺ
μΉ λμ μ νλ‘ν νμ
λ©μλ
λΌκ³ λΆλ₯΄λ νΈμ΄ λ μ’μ μ μλ€.
ν΄λμ€ μμ
ν΄λμ€ μμμ κ°μ²΄μ§ν₯μμ κ°μ₯ μ€μν μμ μ€ νλμ΄λ€.
// Grade μμ±μ ν¨μ λ° μΈμ€ν΄μ€
const Grade = () => {
const args = Array.prototype.slice.call(arguments);
for (let i = 0; i < args.length; i++) {
this[i] = args[i];
}
this.length = args.length;
};
Grade.prototype = [];
const g = new Grade(100, 80);
μλ°μ€ν¬λ¦½νΈμμ ν΄λμ€ μμμ ꡬννλ€λ κ²μ κ²°κ΅ νλ‘ν νμ
체μ΄λμ μ μ°κ²°ν κ²κ³Ό κ°λ€.
λ€λ§, μ무리 체μ΄λμ μ μ°κ²°νλ€κ³ νλλΌλ μΈλΆμ μΌλ‘ μλ²½νκ² superclass
μ subclass
μ ꡬνμ΄ μ΄λ€μ§ κ²μ μλλ€.
μλ₯Ό λ€λ©΄, length
νλ‘νΌν°κ° configurable
(μμ κ°λ₯)νλ€λ μ κ³Ό, Grade.prototype
μ λΉ λ°°μ΄μ μ°Έμ‘°μμΌ°λ€λ μ μ΄ ν° λ¬Έμ μ΄λ€.
...
g.push(90);
console.log(g);
/* Array {
'0': 100,
'1': 80,
'2': 90,
length: 3,
__proto__: { length: 3 }
} */
delete g.length;
g.push(70);
console.log(g);
/* Array {
'0': 70,
'1': 80,
'2': 90,
length: 1,
__proto__: { length: 1 }
} */
length
νλ‘νΌν°λ₯Ό μμ νκ³ λ€μ push
λ₯Ό νλ, push
ν κ°μ΄ 0λ²μ§Έ μΈλ±μ€μ λ€μ΄κ°κ³ length
λ 1μ΄ λμλ€.
λ΄μ₯κ°μ²΄μΈ λ°°μ΄ μΈμ€ν΄μ€μ length
νλ‘νΌν°λ configurable
μμ±μ΄ false
λΌμ μμ κ° λΆκ°λ₯ν λ°λ©΄,
Grade ν΄λμ€μ μΈμ€ν΄μ€λ λ°°μ΄ λ©μλλ₯Ό μμνμ§λ§ κΈ°λ³Έμ μΌλ‘ μΌλ° κ°μ²΄μ μ±μ§μ κ·Έλλ‘ μ§λλ―λ‘ μμ κ° κ°λ₯ν΄μ λ¬Έμ κ° λλ€.
λ°λΌμ length
κ°μ μμ ν νμ g.__proto__
μ¦ Grade.prototype
μ΄ λΉ λ°°μ΄μ κ°λ¦¬ν€κ³ μκΈ° λλ¬Έμ μλ°μ€ν¬λ¦½νΈκ° push λͺ
λ Ήμ μν΄ g.length
λ₯Ό μ½κ³ μ νμ λ g.length
κ° μμκ³ , μλ°μ€ν¬λ¦½νΈλ νλ‘ν νμ
체μ΄λμ νκ³
g.__proto__.length
λ₯Ό μ½μ΄μλ€.
μ΄μ²λΌ ES5κΉμ§μ ν΄λμ€ μμ ꡬνμ λ¬Έμ κ° λ°μν μ¬μ§κ° μμκ³ , μ΄μ ES6μμλ 본격μ μΌλ‘ ν΄λμ€ λ¬Έλ²μ΄ λμ λμλ€.
π‘μ°Έκ³ ! ν΄λμ€μ μΆμμ±μ μ§ν€λ κ² μ€μν μ΄μ λ μμν΄λμ€μ λ°μ΄ν°κ° μ€μΌλλ©΄, μμν΄λμ€μ 곡ν΅μ±μ§μ μ°Έμ‘°νκ³ μλ λ€λ₯Έ μλ§μ νμν΄λμ€κΉμ§ λ°μ΄ν° μ€μΌμ΄ μΌμ΄λκΈ° λλ¬Έμ΄λ€.
μΆμμ±:
- λ³Έμ§μ , 보νΈμ , κ΄λ μ μ±μ§. μ¦, 곡ν΅μ±μ§.
μΆμν:
- κ°λ³μ μ¬λ¬Όμ΄λ νμμ 곡ν΅λ μμ±μ΄λ κ΄κ³ λ°μλ₯Ό λ½μλ΄λ κ².
- 볡μ‘ν μλ£, λͺ¨λ, μμ€ν λ±μΌλ‘λΆν° ν΅μ¬μ μΈ κ°λ λλ κΈ°λ₯μ κ°μΆλ € λ΄λ κ².
- 곡ν΅λΆλΆμ μμ ν΄λμ€/μΈν°νμ΄μ€λ‘ λͺ¨μΌλ μΌ.
- λͺ¨λμ κΈ°λ₯μ μ½κ² μ΄μ©ν μ μλλ‘ λ¨μννλ μΌ.
ES6μ ν΄λμ€ λ° ν΄λμ€ μμ
var ES5 = function(name) {
console.log(name) // 'es5'
this.name = name;
};
ES5.staticMethod = function () {
console.log(this.name) // 'ES5'
return this.name + ' staticMethod';
};
ES5.prototype.method = function () {
return this.name + ' method';
};
var es5Instance = new ES5('es5');
console.log(ES5.staticMethod()); // 'ES5 staticMethod'
console.log(es5Instance.method()); // 'es5 method'
-------------------------------------------
const ES6 = class {
constuctor (name) {
this.name = name;
}
static staticMethod () {
console.log(this.name); // 'ES6'
return this.name + ' staticMethod';
}
method () {
console.log(this.name); // undefined
return this.name + ' method';
}
};
const es6Instance = new ES6('es6');
console.log(ES6.staticMethod()); // 'ES6 staticMethod'
console.log(es6Instance.method()); // 'undefined method'
ES6μ constructor
λ ES5μμμ μμ±μ ν¨μμ λμΌν μν μ μννλ€.
static
ν€μλλ ν΄λΉ λ©μλκ° static
λ©μλμμ μ리λ λ΄μ©μΌλ‘, μμ±μ ν¨μ(ν΄λμ€) μμ λ§μ΄ νΈμΆν μ μλ€.
method
λ μλμΌλ‘ prototype
κ°μ²΄ λ΄λΆμ ν λΉλλ λ©μλμ΄λ€. μΈμ€ν΄μ€κ° νλ‘ν νμ
체μ΄λμ ν΅ν΄ λ§μΉ μμ μ κ²μ²λΌ νΈμΆν μ μλ λ©μλμ΄λ€.
β¨ tl;dr
- ν΄λμ€μ μΈμ€ν΄μ€
- μ΄λ€ μ¬λ¬Όμ κ³΅ν΅ νΉμ±μ λͺ¨μ μ μν μΆμμ μΈ κ°λ
- μΈμ€ν΄μ€λ ν΄λμ€μ μμ±μ μ§λλ ꡬ체μ μΈ μ¬λ‘
- μμ ν΄λμ€(superclass)μ 쑰건μ μΆ©μ‘±νλ©΄μ λμ± - ꡬ체μ μΈ μ‘°κ±΄μ΄ μΆκ°λ κ²μ νμ ν΄λμ€(subclass)λΌκ³ ν¨
-
λ©μλ
- ν΄λμ€μ
prototype
λ΄λΆμ μ μλ λ©μλλ νλ‘ν νμ λ©μλλΌκ³ ν¨ - νλ‘ν νμ λ©μλλ μΈμ€ν΄μ€κ° λ§μΉ μμ μ κ²μ²λΌ νΈμΆν μ μμ
- ν΄λμ€(μμ±μ ν¨μ)μ μ§μ μ μν λ©μλλ μ€νν± λ©μλλΌκ³ ν¨
- μ€νν± λ©μλλ μΈμ€ν΄μ€κ° μ§μ νΈμΆν μμκ³ ν΄λμ€(μμ±μ ν¨μ)μ μν΄μλ§ νΈμΆν μ μμ
- ν΄λμ€μ
-
ν΄λμ€ μμμ νλ΄ λ΄κΈ° μν μΈκ°μ§ λ°©λ²
SubClass.prototype
μSuperClass
μ μΈμ€ν΄μ€λ₯Ό ν λΉν λ€μ νλ‘νΌν°λ₯Ό λͺ¨λ μμ νλ λ°©λ²- λΉ ν¨μ(Bridge)λ₯Ό νμ©νλ λ°©λ²
Object.create
λ₯Ό μ΄μ©νλ λ°©λ²
- ES6
- ν΄λμ€ λ¬Έλ²μ΄ λμ λ¨
- μ΄μ κΉμ§λ μμ λ° μΆμνλ₯Ό ꡬννκΈ° μν΄ μλΉν 볡μ‘ν λ°©λ²μ μ¬μ©νλλ° ES6μμλ μλΉν κ°λ¨νκ² μ²λ¦¬λ¨