μ΄λ² ν¬μ€ν μμλ ES6 μ€νμμ μΆκ°λ ν¨μμμμ μΆκ° κΈ°λ₯μ λν΄μ λ€λ€λ³Έλ€.
ES6λ 무μμΌκΉ? ES6λ ECMAλΌλ κ΅μ 기ꡬμμ λ§λ νμ€λ¬ΈμμΈ ECMAScript(=ES)μ 6λ²μ§Έ κ°μ ν λ¬Έμμ μλ νμ€ μ€νμ λ§νλ€.
λ§μ λ²μ μ€ ES6κ° μμ£Ό μΈκΈλλ μ΄μ λ νμ΄ν ν¨μ, Promise, Spread μ°μ°μ, ν νλ¦Ώ 리ν°λ΄λ± μ΅μ μλ°μ€ν¬λ¦½νΈ κ°λ° νκ²½μμ μ΄μ©λλ λ¬Έλ²λ€μ΄ λκ±° μλ‘ λ±μ₯νκΈ° λλ¬Έμ΄λ€.
ECMAScriptμ λν΄μ μ‘°κΈ λ μμ보μ. ECMAScriptλ λ€μν μΉ λΈλΌμ°μ λ€μμ JavaScriptκ° κ³΅ν΅λκ² μ μλλκΈ° μν΄μ μ μν νμ€ κ·κ²©μ λ§νλ€.
ECMA κ΅μ 기ꡬμμ 'ECMAScript standard'λΌλ μ€ν¬λ¦½νΈ νμ€μ λ§λ λ€.
π‘ ECMASCript μ€ν μ μμλ μ΄κ³³μμ νμΈν΄ λ³Ό μ μμ΅λλ€.
μ, κ·Έλ¬λ©΄ ES6μμ μ μλ ν¨μμ μΆκ° κΈ°λ₯μ λν΄ μ΄ν΄λ³΄μ.
λ€μκ³Ό κ°μ κΈ°λ₯λ€μ λ±μ₯ λ°°κ²½μ μ΄ν΄λ³Έλ€.
- λ©μλ ν¨μ
- νμ΄ν ν¨μ
- rest νλΌλ―Έν°
ES6 λ±μ₯ μ λͺ¨λ ν¨μλ μΌλ° ν¨μ, μμ±μ ν¨μλ‘μ¨ νΈμΆμ΄ κ°λ₯νλ€.
λ€μ μ½λλ₯Ό 보μ.
var foo = function () {
return 1;
}
// μΌλ° ν¨μλ‘ νΈμΆ
foo();
// μμ±μ ν¨μλ‘ νΈμΆ
new foo();
// λ©μλλ‘ νΈμΆ
var obj = {foo: foo}
obj.foo()
μ¦, ES6 μ μ λͺ¨λ ν¨μλ [[Constructor]] μ΄λ©΄μ [[Callable]]μ΄μλ€. (λ΄λΆ μ¬λ‘―κ³Ό λ΄λΆ λ©μλμ λν΄ μ΅μνμ§ μμΌμ λΆλ€μ νλ‘νΌν° μ΄νΈλ¦¬λ·°νΈ ν¬μ€ν μ μ°Έμ‘°νμΈμ!)
μΈλ» 보면 νΈλ¦¬ν΄ λ³΄μΌ μ μμΌλ μ΄λ¬ν λ°©μμ μμΉ«νλ©΄ λ²κ·Έλ₯Ό μ λ°ν μ μλ€. μλ₯Ό λ€λ©΄, μμ±μ ν¨μλ‘μ¨ μ΄μ©λλ©΄ μ λλ ν¨μλ€μ΄ new ν€μλλ₯Ό ν΅ν΄ μμ±μ ν¨μλ‘ νΈμΆ νλ κ²μ λ§μ λ°©λ²μ΄ μλ€.
λν, μμ±μ ν¨μλ‘μ¨ μ¬μ©νμ§ μμ ν¨μλ€λ prototype κ°μ²΄λ₯Ό λ§λ€κΈ° λλ¬Έμ μ±λ₯μ μΌλ‘λ μ’μ§ μλ€.
μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ ES6μμλ ν¨μλ₯Ό μ¬μ© λͺ©μ μ λ°λΌ 3κ°μ§λ‘ λͺ νν ꡬλΆνλ€.
- μΌλ° ν¨μ
- λ©μλ
- νμ΄ν ν¨μ
μ¬κΈ°μ μΌλ° ν¨μλ§μ΄ μμ±μ ν¨μλ‘μ¨ νΈμΆ λ μ μλ€.
ES6 μ¬μμμ λ©μλλ λ©μλ μΆμ½ ννμΌλ‘ μ μλ ν¨μλ§μ μλ―Ένλ€.
const obj = {
x: 1,
foo(){ return this.x;}, // λ©μλ
bar: function(){ return this.x} // λ©μλ μλ
}
// barλ§ μμ±μ ν¨μλ‘ new ν€μλμ ν¨κ» νΈμΆ κ°λ₯
// new obj.bar() ??
obj.foo.hasOwnProperty('prototype') // false
obj.bar.hasOwnProperty('prototype') // true
μ μ½λμμ 보면 λ©μλ μΆμ½ ννμΌλ‘ μμ±λ fooλ§ λ©μλμ΄κ³ , barμ λ©μλκ° μλλ€. λ°λΌμ ECMAScriptμμλ λ©μλ μμ± μ λ©μλ μΆμ½ ννμΌλ‘ ν¨μλ₯Ό μ μΈν κ²μ κΆμ₯νλ€.
λ©μλμΈ fooμ κ²½μ° prototype κ°μ²΄λ₯Ό κ°μ§ μκ³ , λ©μλκ° μλ barμ κ²½μ° prototype κ°μ²΄λ₯Ό κ°λκ²μ νμΈν μ μλ€.
νμ΄ν ν¨μλ ES6 μ¬μμμ μ²μ λ±μ₯ν ν¨μλ‘, this λ°μΈλ©μ κ°μ§ μλ κ²μ΄ κ°μ₯ ν° νΉμ§μ΄λ€. νμ΄ν ν¨μλ μ½λ°± ν¨μ λ΄λΆμμ thisκ° μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
this κ΄λ ¨ ν¬μ€ν
μμλ νμ©νλ μ½λμΈλ°, μ΄ν΄λ₯Ό μν΄ νλ² λ κ°μ§κ³ μλ€.
μλ μ½λλ₯Ό 보μ.
class Prefixer {
constructor(prefix) {
this.prefix = prefix;
}
add(arr) {
return arr.map(function (item) {
return this.prefix + item;
// TypeError: Cannot read property 'prefix' of undefined
});
}
}
const prefixer = new Prefixer('-webkit-');
console.log(prefixer.add(['transition', 'user-select']));
Prefixer Class λ΄λΆμ add λ©μλκ° μλν λμμ μ λ¬ν λ°°μ΄μ μμλ₯Ό λλ©° prefixμΈ '-webkit-'μ λΆμΈ λ¬Έμμ΄μ λ°ννλ κ²μ΄λ€.
νμ§λ§ add λ©μλ arr.mapμμ μ½λ°± ν¨μλ μΌλ° ν¨μλ‘ νΈμΆλμκ³ , μΌλ° ν¨μμμ thisλ μ μ κ°μ²΄μΈ windowλ₯Ό κ°λ¦¬ν€κΈ° λλ¬Έμ prefixκ°μ μ°Έμ‘°ν μ μλ€.
μ΄λ° κ²½μ° κΈ°μ‘΄μλ bindλ₯Ό ν΅ν΄ thisλ₯Ό bindingνκ±°λ classμ thisλ₯Ό λ€λ₯Έ λ³μμ μ μ₯νκ³ κ·Έ λ³μμ μ κ·Όνλ λ°©μμΌλ‘ ν΄κ²°νμ¬μΌ νλ€.
ES6 μ΄μμ κ°λ°νκ²½μμλ μλμ κ°μ΄ νμ΄ν ν¨μλ₯Ό μ΄μ©νμ¬ ν΄κ²° κ°λ₯νλ€.
class Prefixer {
constructor(prefix) {
this.prefix = prefix;
}
add(arr) {
return arr.map(item => this.prefix + item);
}
}
const prefixer = new Prefixer('-webkit-');
console.log(prefixer.add(['transition', 'user-select']));
// ['-webkit-transition', '-webkit-user-select']
νμ΄ν ν¨μλ this λ°μΈλ©μ΄ μκΈ° λλ¬Έμ μμ μ€μ½νμΈ Prefixer classλ₯Ό μ°Έμ‘°νκ² λλ€.
rest νλΌλ―Έν°λ ν¨μμ μ λ¬λ μΈμλ€μ λͺ©λ‘μ λ°°μ΄λ‘ μ λ¬λ°λλ€.
function foo(...rest){
console.log(rest); // [1,2,3,4,5]
}
foo(1,2,3,4,5)
ES6 μ΄μ μ μμ£Ό μ¬μ©λ argumentμ κ±°μ κ°μ κΈ°λ₯μ νμ§λ§, arguments κ°μ²΄λ λ°°μ΄μ΄ μλ μ μ¬ λ°°μ΄ κ°μ²΄μ΄λ―λ‘ λ°°μ΄ λ©μλλ₯Ό μ¬μ©νλ €λ©΄ λ°°μ΄λ‘ λ³νν΄μΌ νλ€λ λ¨μ μ΄ μμλ€.
function sum() {
var array = Array.prototype.slice.call(arguments);
return array.reduce(function(pre,cur){
return pre + cur;
}, 0);
}
console.log(sum(1,2,3,4,5)) // 15
Rest νλΌλ―Έν°λ₯Ό μ¬μ©νλ€λ©΄ λ³ν κ³Όμ μ΄ μμ΄ μ¬μ© κ°λ₯νλ€.
function sum(...args){
return args.reduce((pre,cur) => pre+cur,0))
}
console.log(sum(1,2,3,4,5)) // 15