ES6 μ΄μ μ ν¨μλ λμΌν ν¨μλΌλ λ€μν ννλ‘ νΈμΆν μ μλ€.
var foo = function () {
return 1;
};
// μΌλ°μ μΈ ν¨μλ‘μ νΈμΆ
foo(); // -> 1
// μμ±μ ν¨μλ‘μ νΈμΆ
new foo(); // foo {}
// λ©μλλ‘μ νΈμΆ
var obj = { foo: foo };
obj.foo(); // 1
ES6 μ΄μ μ ν¨μλ μ¬μ© λͺ©μ μ λ°λΌ λͺ νν ꡬλΆλμ§ μλλ€. μ¦, ES6 μ΄μ μ λͺ¨λ ν¨μλ μΌλ° ν¨μλ‘μ νΈμΆν μ μλ κ²μ λ¬Όλ‘ μμ±μ ν¨μλ‘μ νΈμΆν μ μλ€.
ES6 μ΄μ μ μΌλ°μ μΌλ‘ λ©μλλΌκ³ λΆλ₯΄λ κ°μ²΄μ λ°μΈλ©λ ν¨μλ μΌλ° ν¨μλ‘ νΈμΆν μ μλ κ²μ λ¬Όλ‘ μμ±μ ν¨μλ‘μ νΈμΆν μ λ μλ€.
// νλ‘νΌν° fμ λ°μΈλ©λ ν¨μλ callableμ΄λ©° constructorλ€.
var obj = {
x: 10,
f: function () { return this.x; }
};
// νλ‘νΌν° fμ λ°μΈλ©λ ν¨μλ₯Ό λ©μλλ‘μ νΈμΆ
cosole.log(obj.f()); // 10
// νλ‘νΌν° fμ λ°μΈλ©λ ν¨μλ₯Ό μΌλ° ν¨μλ‘μ νΈμΆ
var bar = obj.f;
console.log(bar()); // undefined
// νλ‘νΌν° fμ λ°μΈλ ν¨μλ₯Ό μμ±μ ν¨μλ‘μ νΈμΆ
console.log(new obj.f()); // f {}
μ΄μ²λΌ ES6 μ΄μ μ λͺ¨λ ν¨μλ μ¬μ© λͺ©μ μ λ°λΌ λͺ νν ꡬλΆμ΄ μμΌλ―λ‘ νΈμΆ λ°©μμ νΉλ³ν μ μ½μ΄ μκ³ μμ±μ ν¨μλ‘ νΈμΆλμ§ μμλ νλ‘ν νμ κ°μ²΄λ₯Ό μμ±νλ€. μ΄λ νΌλμ€λ¬μ°λ©° μ€μλ₯Ό μ λ°ν κ°λ₯μ±μ΄ μκ³ μ±λ₯μλ μ’μ§ μλ€.
ES6 ν¨μμ κ΅¬λΆ | constructor | prototype | super | arguments |
---|---|---|---|---|
μΌλ° ν¨μ(Normal) | O | O | X | O |
λ©μλ(Method) | X | X | O | O |
νμ΄ν ν¨μ(Arrow) | X | X | X | X |
ES6 μ¬μμμ λ©μλλ λ©μλ μΆμ½ ννμΌλ‘ μ μλ ν¨μλ§μ μλ―Ένλ€.
const obj = {
x: 1,
// fooλ λ©μλλ€.
foo() { return thos.x;}
// barμ λ°μΈλ©λ ν¨μλ λ©μλκ° μλ μΌλ° ν¨μλ€.
bar: function() {return this.x;}
};
console.log(obj.foo()); // 1
console.log(obj.bar()); // 1
ES6 μ¬μμμ μ μν λ©μλ(μ΄ν ES6 λ©μλ)λ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ
non-constructor
λ€. λ°λΌμ ES6 λ©μλλ μμ±μ ν¨μλ‘μ νΈμΆν μ μλ€.
new obj.foo(); // -> TypeError: obj.foo is not a constructor
new obj.bar(); // -> bar {}
ES6 λ©μλλ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμΌλ―λ‘
prototype
νλ‘νΌν°κ° νλ‘ν νμ λ μμ±νμ§ μλλ€.
// obj.fooλ constructorκ° μλ ES6 λ©μλμ΄λ―λ‘ prototype νλ‘νΌν°κ° μλ€.
obj.foo.hasOwnProperty('prototype'); // -> false
// obj.barλ constructorμΈ μΌλ° ν¨μμ΄λ―λ‘ prototype νλ‘νΌν°κ° μλ€.
obj.bar.hasOwnProperty('prototype'); // -> true
μ°Έκ³ λ‘ νμ€ λΉλμΈ κ°μ²΄κ° μ 곡νλ νλ‘ν νμ λ©μλμ μ μ λ©μλλ λͺ¨λ
non-constructor
λ€.
ES6 λ©μλλ μμ μ λ°μΈλ©ν κ°μ²΄λ₯Ό κ°λ¦¬ν€λ λ΄λΆ μ¬λ‘―[[HomeObject]]
λ₯Ό κ°λλ€.super
μ°Έμ‘°λ λ΄λΆ μ¬λ‘―[[HomeObject]]
λ₯Ό μ¬μ©νμ¬ μνΌν΄λμ€μ λ©μλλ₯Ό μ°Έμ‘° λ΄λΆ μ¬λ‘―[[HomeObject]]
λ₯Ό κ°λ ES6 λ©μλλsuper
ν€μλλ₯Ό μ¬μ©ν μ μλ€.
const base = {
name : 'Lee',
sayHi() {
return `Hi ${this.name}`'
}
};
cosnt derived = {
__proto__ : base,
// sayHiλ ES6 λ©μλλ€. ES6 λ©μλλ [[HomeObject]]λ₯Ό κ°λλ€.
// sayHiμ [[HomeObject]]λ sayHiκ° λ°μΈλ κ°μ²΄μΈ derivedλ₯Ό κ°λ¦¬ν€κ³
// superλ sayHidml [[HomeObject]]μ νλ‘ν νμ
μΈ baseλ₯Ό κ°λ¦¬ν¨λ€.
sayHi() {
return `${super.sayHi()}. how are you doing?`;
}
};
console.log(derived.sayHi()); // Hi! Lee. how are you doing?
λ©μλλ₯Ό μ μν λ νλ‘νΌν° κ°μΌλ‘ μ΅λͺ ν¨μ ννμμ ν λΉνλ ES6 μ΄μ μ λ°©μμ μ¬μ©νμ§ μλ κ²μ΄ μ’λ€.
νμ΄ν ν¨μλ ννλ§ κ°λ΅ν κ²μ΄ μλλΌ λ΄λΆ λμλ κΈ°μ‘΄μ ν¨μλ³΄λ€ κ°λ΅νλ€. νΉν νμ΄ν ν¨μλ μ½λ°± ν¨μ λ΄λΆμμ
this
κ° μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν λμμΌλ‘ μ μ©νλ€.
νμ΄ν ν¨μλ ν¨μ μ μΈλ¬ΈμΌλ‘ μ μν μ μκ³ ν¨μ ννμμΌλ‘ μ μν΄μΌ νλ€. νΈμΆ λ°©μμ κΈ°μ‘΄ ν¨μμ λμΌ
const multiply = (x, y) => x + y;
multiply(2, 3); // -> 6
맀κ°λ³μ μ¬λ¬ κ°μΈ κ²½μ° μκ΄νΈ
()
μμ 맀κ°λ³μλ₯Ό μ μΈνλ€.
const arrow = (x, y) => { ... };
맀κ°λ³μκ° ν κ°μΈ κ²½μ° μκ΄νΈ
()
λ₯Ό μλ΅ν μ μλ€.
const arrow = x => { ... };
맀κ°λ³μκ° μλ κ²½μ° μκ΄νΈ
()
λ₯Ό μλ΅ν μ μλ€.
const arrow = () => { ... };
ν¨μ λͺΈμ²΄κ° νλμ λ¬ΈμΌλ‘ ꡬμ±λλ€λ©΄ ν¨μ λͺΈμ²΄λ₯Ό κ°μΈλ μ€κ΄νΈ
{}
λ₯Ό μλ΅ν μ μλ€. μ΄λ ν¨μ λͺΈμ²΄ λ΄λΆμ λ¬Έμ΄ κ°μΌλ‘ νκ°λ μ μλ ννμμΈ λ¬Έμ΄λΌλ©΄ μ묡μ μΌλ‘ λ°νλλ€.
// conscise body
const power = x => x ** 2;
power(2); // -> 4
// μ ννμ λ€μκ³Ό λμΌνλ€.
// block body
const power = x => { return x ** 2 };
ν¨μ λͺΈμ²΄λ₯Ό κ°μΈλ μ€κ΄νΈ
{}
λ₯Ό μλ΅ν κ²½μ° ν¨μ λͺΈμ²΄ λ΄λΆμ λ¬Έμ΄ ννμμ΄ μλ λ¬Έμ΄λΌλ©΄ μλ¬κ° λ°μνλ€. ννμμ΄ μλ λ¬Έμ λ°νν μ μκΈ° λλ¬Έμ΄λ€.
const arrow = () => const x = 1; // SyntaxError: Unexpercted token 'const'
// μ ννμ λ€μκ³Ό κ°μ΄ ν΄μλλ€.
const arrow = () => { return const x = 1; };
λ°λΌμ ν¨μ λͺΈμ²΄κ° νλμ λ¬ΈμΌλ‘ ꡬμ±λλ€ ν΄λ ν¨μ λͺΈμ²΄μ λ¬Έμ΄ ννμμ΄ μλ λ¬Έμ΄λΌλ©΄ μ€κ΄νΈλ₯Ό μλ΅ν μ μλ€.
κ°μ²΄ 리ν°λ΄μ λ°ννλ κ²½μ° κ°μ²΄ 리ν°λ΄μ μκ΄νΈ()
λ‘ κ°μΈ μ£Όμ΄μΌ νλ€.
const create = (id, content) => {{id, contend}};
create(1, 'JavaScript'); -> {id: 1, content: "JavaScript"}
// μ ννμ λ€μκ³Ό λμΌνλ€
const create = (id, content) => { return {id, content}; };
κ°μ²΄ 리ν°λ΄μ μκ΄νΈ
()
λ‘ κ°μΈμ§ μμΌλ©΄ κ°μ²΄ 리ν°λ΄μ μ€κ΄νΈ{}
λ₯Ό ν¨μ λͺΈμ²΄λ₯Ό κ°μΈλ μ€κ΄νΈ{}
λ‘ μλͺ» ν΄μνλ€.
ν¨μ λͺΈμ²΄κ° μ¬λ¬ κ°μ λ¬ΈμΌλ‘ ꡬμ±λλ€λ©΄ ν¨μ λͺΈμ²΄λ₯Ό κ°μΈλ μ€κ΄νΈ{}
λ₯Ό μλ΅ν μ μλ€. μ΄λ λ°νκ°μ΄ μλ€λ©΄ λͺ μμ μΌλ‘ λ°νν΄μΌ νλ€.
const sum = (a, b) => {
const result = a + b;
return result;
};
νμ΄ν ν¨μλ μ¦μ μ€ν ν¨μλ‘ μ¬μ©ν μ μλ€.
const person = (name => ({
sayHi() { return `Hi? My name is ${name}.`;}
}))('Lee');
console.log(person.sayHi()); // Hi? My name is Lee
νμ΄ν ν¨μλ μΌκΈ κ°μ²΄μ΄λ―λ‘
Array.prototype.map
Array.prototype.filter
Array.prototype.reduce
κ°μ κ³ μ°¨ ν¨μμ μΈμλ‘ μ λ¬ν μ μλ€. μ΄ κ²½μ° μΌλ°μ μΈ ν¨μ ννμλ³΄λ€ ννμ΄ κ°κ²°νκ³ κ°λ μ±μ΄ μ’λ€.
// ES5
[1, 2, 3].map(function (v) {
return v * 2;
});
// ES6
[1,2,3].map(v => v * 2); // -> [2,4,6]
non-constructor
λ€.const Foo = () => {};
// νμ΄ν ν¨μλ μμ±μ ν¨μλ‘μ νΈμΆν μ μλ€.
new Foo(); // TypeError: Foo is not a constructor
νμ΄ν ν¨μλ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμΌλ―λ‘ prototype νλ‘νΌν°κ° μκ³ νλ‘ν νμ λ μμ±νμ§ μλλ€.
const Foo = () => {};
// νμ΄ν ν¨μλ prototype νλ‘νΌν°κ° μλ€.
Foo.hasOwnProperty('prototype') // -> fasle
μΌλ° ν¨μλ μ€λ³΅λ 맀κ°λ³μ μ΄λ¦μ μ μΈν΄λ μλ¬κ° λ°μνμ§ μλλ€.
function normal(a, a) { return a + a; }
console.log(normal(1, 2)); // 4
νμ΄ν ν¨μμμ μ€λ³΅λ 맀κ°λ³μ μ΄λ¦μ μ μΈνλ©΄ μλ¬κ° λ°μνλ€.
const arrow = (a, a) => a + a;
// SyntaxError: Duplicate parameter name not allowed in this context
this
arguments
super
new.target
λ°μΈλ©μ κ°μ§ μλλ€.νμ΄ν ν¨μ λ΄λΆμμ
this
arguments
super
new.target
μ μ°Έμ‘°νλ©΄ μ€μ½ν 체μΈμ ν΅ν΄ μμ μ€μ½νμthis
arguments
super
new.target
μ μ°Έμ‘°νλ€.
λ§μ½ νμ΄ν ν¨μμ νμ΄ν ν¨μκ° μ€μ²©λμ΄ μλ€λ©΄ κ°μ₯ κ°κΉμ΄ μμ ν¨μμ€μμ νμ΄νν¨μ μλ ν¨μμthis
arguments
super
new.target
μ μ°Έμ‘°νλ€.
νμ΄ν ν¨μκ° μΌλ° ν¨μμ ꡬλ³λλ κ°μ₯ ν° νΉμ§μ λ°λ‘
this
λ€. κ·Έλ¦¬κ³ νμ΄ν ν¨μλ λ€λ₯Έ ν¨μμ μΈμλ‘ μ λ¬λμ΄ μ½λ°± ν¨μλ‘ μ¬μ©λλ κ²½μ°κ° λ§λ€.
νμ΄ν ν¨μμthis
λ μΌλ° ν¨μμthis
μ λ€λ₯΄κ² λμνλ€. μ΄λ"μ½λ°± ν¨μ λ΄λΆμ this λ¬Έμ "
μ¦, μ½λ°± ν¨μ λ΄λΆμthis
κ° μΈλΆ ν¨μμthis
μ λ€λ₯΄κΈ° λλ¬Έμ λ°μνλ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μλμ μΌλ‘ μ€κ³λ κ².
class Prefixer {
constructor(prefix) {
this.prefix = prefix;
}
add(arr) {
// add λ©μλλ μΈμλ‘ μ λ¬λ λ°°μ΄ arrμ μννλ©° λ°°μ΄μ λͺ¨λ μμμ prefixλ₯Ό μΆκ°νλ€.
// β
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']));
μ μμ μ€ν κ²°κ³Όκ°μ
TypeError
Array.prototype.map
λ©μλκ° μ½λ°± ν¨μλ₯Ό μΌλ° ν¨μλ‘ νΈμΆνκΈ° λλ¬Έμ β‘μμthis
λundefined
λ₯Ό κ°λ¦¬ν¨λ€.
μΌλ° ν¨μλ‘μ νΈμΆλλ λͺ¨λ ν¨μ λ΄λΆμthis
λ μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν€κ³ , μΈλΆ ν¨μμthis
λ νΈμΆν κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
β , β‘κ° κ°λΌν€λthis
κ° λ€λ₯΄λ―λ‘TypeError
λ°μ.
this
λ¬Έμ ν΄κ²°prefixer
κ°μ²΄λ₯Ό κ°λ¦¬ν€λ this
λ₯Ό μΌλ¨ ννΌμν¨ νμ μ½λ°± ν¨μ λ΄λΆμμ μ¬μ©νλ€....
add(arr) {
// thisλ₯Ό μΌλ¨ ννΌμν¨λ€.
const that = this;
return arr.map(function (item) {
// this λμ thatμ μ°Έμ‘°νλ€.
return that.prefix + ' ' + item;
});
}
...
Array.prototype.map
μ λ λ²μ§Έ μΈμλ‘ add
λ©μλλ₯Ό νΈμΆν prefixer
κ°μ²΄λ₯Ό κ°λ¦¬ν€λ this
λ₯Ό μ λ¬νλ€.ES5μμ λμ λ
Array.prototype.map
μ "μ½λ°°κ° ν¨μ λ΄λΆμthis
λ¬Έμ "λ₯Ό ν΄κ²°νκΈ° μν΄ λ λ²μ§Έ μΈμλ‘ μ½λ°± ν¨μ λ΄λΆμμthis
λ‘ μ¬μ©ν κ°μ²΄λ₯Ό μ λ¬ν μ μλ€.
...
add(arr) {
return arr.map(function (item) {
return this.prefix + ' ' + item;
}, this); // thisμ λ°μΈλ©λ κ°μ΄ μ½λ°± ν¨μ λ΄λΆμ thisμ λ°μΈλ©λλ€.
}
...
Function.prototype.bind
λ©μλλ₯Ό μ¬μ©νμ¬ add
λ©μλλ₯Ό νΈμΆν prefixer
κ°μ²΄λ₯Ό κ°λ¦¬ν€λ this
λ₯Ό λ°μΈλ©νλ€....
add(arr) {
return arr.map(function (item) {
return this.prefix + ' ' + item;
}.bind(this)); // thisμ λ°μΈλ κ°μ΄ μ½λ°± ν¨μ λ΄λΆμ thisμ λ°μΈλ©λλ€.
}
...
this
λ¬Έμ ν΄κ²°νμ΄ν ν¨μ μ¬μ©νμ¬ "μ½λ°± ν¨μ λ΄λΆμ
this
λ¬Έμ λ₯Ό ν΄κ²°
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
λ°μΈλ©μ κ°μ§ μλλ€. λ°λΌμ νμ΄ν ν¨μ λ΄λΆμμthis
μ°Έμ‘°νλ©΄ μμ μ€μ½νμthis
λ₯Ό κ·Έλλ‘ μ°Έμ‘°νλ. μ΄λ₯Όlexcal this
λΌ νλ€. μ΄λ λ§μΉλ μ컬 μ€μ½ν
μ κ°μ΄ νμ΄ν ν¨μμthis
κ° ν¨μκ° μ μλ μμΉμ μν΄ κ²°μ λλ€λ κ²μ μλ―Ένλ€.
νμ΄ν ν¨μλ₯ΌFunction.prototype.bind
λ₯Ό μ¬μ©νμ¬ νννλ©΄ λ€μκ³Ό κ°λ€.
// νμ΄ν ν¨μλ μμ μ€μ½νμ thisλ₯Ό μ°Έμ‘°νλ€.
() => this.x;
// μ΅λͺ
ν¨μμ μμ μ€μ½νμ thisλ₯Ό μ£Όμ
νλ€. μ νμ΄ν ν¨μμ λμΌνκ² λμνλ€.
(function () { return this.x; }).bind(this);
νμ΄ν ν¨μμ νμ΄ν ν¨μκ° μ€μ²©λμ΄ μλ€λ©΄ μμ νμ΄ν ν¨μμλ
this
λ°μΈλ©μ΄ μμΌλ―λ‘ μ€μ½ν μ²΄μΈ μμμ κ°μ₯ κ°κΉμ΄ μμ ν¨μ μ€μμ νμ΄ν ν¨μκ° μλ ν¨μμthis
λ₯Ό μ°Έμ‘°νλ€.
// μ€μ²© ν¨μ fooμ μμ μ€μ½νλ μ¦μ μ€ν ν¨μλ€.
// λ°λΌμ νμ΄ν ν¨μ fooμ thisλ μμ μ€μ½νμΈ μ¦μ μ€ν ν¨μμ thisλ₯Ό κ°λ¦¬ν¨λ€.
(function () {
const foo = () => console.log(this);
foo();
}).call({ a:1 });
// bar ν¨μλ νμ΄ν ν¨μλ₯Ό λ°ννλ€.
// bar ν¨μκ° λ°νν νμ΄ν ν¨μμ μμ μ€μ½νλ νμ΄ν ν¨μ barλ€.
// νμ§λ§ νμ΄ν ν¨μλ ν¨μ μ체μ this λ°μΈλ©μ κ°μ§ μμΌλ―λ‘ bar ν¨μκ° λ°νν
// νμ΄ν ν¨μ λ΄λΆμμ μ°Έμ‘°νλ thisλ νμ΄ν ν¨μκ° μλ μ¦μ μ€ν ν¨μμ thisλ₯Ό κ°λ¦¬ν¨λ€.
(function () {
const foo = () => () => console.log(this);
bar()();
}).call({ a: 1}); // { a: 1 }
νμ΄ν ν¨μκ° μ μ ν¨μλΌλ©΄ νμ΄ν ν¨μμ
this
λ μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€. μ μ ν¨μμ μμ μ€μ½νλ μ μμ΄κ³ μ μμμthis
λ μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν€κΈ° λλ¬Έμ΄λ€.
// μ μ ν¨μ fooμ μμ μ€μ½νλ μ μμ΄λ―λ‘ νμ΄ν ν¨μ fooμ thisλ μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
const foo = () => console.log(this);
foo(); // window
νλ‘νΌν°μ ν λΉν νμ΄ν ν¨μλ μ€μ½ν 체μΈμμμ κ°μ₯ κ°κΉμ΄ μμ ν¨μ μ€μμ νμ΄ν ν¨μκ° μλ ν¨μμ
this
λ₯Ό μ°Έμ‘°νλ€.
// increase νλ‘νΌν°μ ν λΉν νμ΄ν ν¨μμ μμ μ€μ½νλ μ μμ΄λ€.
// λ°λΌμ increase νλ‘νΌν°μ ν λΉν νμ΄ν ν¨μμ thisλ μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
const counter = {
num: 1,
increase : () => ++this.num
};
console.log(counter.increase()); // NaN
νμ΄ν ν¨μλ ν¨μ μ체μ
this
λ°μΈλ©μ κ°μ§ μκΈ° λλ¬ΈμFunction.prototype.call
Function.prototype.apply
Function.prototype.bind
λ©μλλ₯Ό μ¬μ©ν΄λ νμ΄ν ν¨μ λ΄λΆμthis
λ₯Ό κ΅μ²΄ν μ μλ€.
νμ΄ν ν¨μκ°Function.prototype.call
Function.prototype.apply
Function.prototype.bind
λ©μλλ₯Ό νΈμΆν μ μλ€λ μλ―Έλ μλλ€. νμ΄ν ν¨μλ ν¨μ μ체μthis
λ°μΈλ©μ κ°μ§ μκΈ° λλ¬Έμthis
λ₯Ό κ΅μ²΄ ν μ μκ³ μΈμ λ μμ μ€μ½νμthis
λ°μΈλ±μ μ°Έμ‘°νλ€.
window.x = 1;
const normal = function () { return this.x; }
const arrow = () => this.x;
console.log(normal.call({ x: 10 })); // 10
console.log(arrow.call({ x: 10 })); // 1
const add = (a, b) => a + b;
console.log(add.call(null, 1, 2)); // 3
console.log(add.apply(null, [1, 2])); // 3
console.log(add.bind(null, 1, 2)()); // 3
λ©μλλ₯Ό νμ΄ν ν¨μλ‘ μ μνλ κ²μ νΌν΄μΌ νλ€. μ¬κΈ°μ λ©μλλ ES6 λ©μλκ° μλ μΌλ°μ μΈ μλ―Έμ λ©μλλ₯Ό μλ―Έ.
// Bad
const person = {
name : 'Lee',
sayHi: () => console.log(`Hi ${this.name}`)
};
// sayHi νλ‘νΌν°μ ν λΉλ νμ΄ν ν¨μ λ΄λΆμ thisλ μμ μ€μ½νμΈ thisκ° κ°λ¦¬ν€λ
// μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ―λ‘ μ΄ μμ λ₯Ό λΈλΌμ°μ μ μ€ννλ©΄ this.nameμ λΉ λ¬Έμμ΄μ κ°λ window.nameκ³Ό κ°λ€.
// μ μ κ°μ²΄ windowμλ λΉνΈμΈ νλ‘νΌν° nameμ΄ μ‘΄μ¬νλ€.
person.sayHi(); // Hi
λ©μλλ₯Ό μ μν λλ ES6 λ©μλ μΆμ½ ννμΌλ‘ μ μν ES6 λ©μλλ₯Ό μ¬μ©νλ κ²μ΄ μ’λ€.
// Good
const person = {
name: 'Lee',
sayHi() {
console.log(`Hi ${this.name}`);
}
};
person.sayHi(); // Hi Lee
νλ‘ν νμ κ°μ±μ νλ‘νΌν°μ νμ΄ν ν¨μλ₯Ό ν λΉνλ κ²½μ°λ λμΌν λ¬Έμ κ° λ°μ.
// Bad
function Person(name) {
this.name = name;
}
Person.prototype.sayHi = () => console.log(`Hi ${this.name}`);
const person = new Person('Lee');
// μ΄ μμ λ₯Ό λΈλΌμ°μ μμ μ€ννλ©΄ this.nameμ λΉ λ¬Έμμ΄μ κ°λ window.nameκ³Ό κ°λ€.
person.sayHi(); // Hi
νλ‘νΌν°λ₯Ό λμ μΆκ°ν λλ ES6 λ©μλ μ μλ₯Ό μ¬μ©ν μ μμΌλ―λ‘ μΌλ° ν¨μλ₯Ό ν λΉνλ€.
// Good
function Person(name) {
this.name = name;
}
Person.prototype.sayHi = function () { console.log(`Hi ${this.name}`); };
const person = new Person('Lee');
person.sayHi(); // Hi Lee
μΌλ° ν¨μκ° μλ ES6 λ©μλλ₯Ό λμ μΆκ°νκ³ μΆλ€λ©΄ λ€μκ³Ό κ°μ΄ κ°μ²΄ 리ν°λ΄μ λ°μΈλ©νκ³ νλ‘ν νμ μ
constructor
νλ‘νΌν°μ μμ±μ ν¨μκ°μ μ°κ²°μ μ¬μ€μ νλ€.
function Person(name) {
this.name = name;
}
Person.prototype = {
// constructor νλ‘νΌν°μ μμ±μ ν¨μ κ°μ μ°κ²°μ μ¬μ€μ
constructor = Person,
sayHi() { console.log(`Hi ${this.name}`); }
};
const person = new Person('Lee');
person.sayHi(); // Hi Lee
ν΄λμ€ νλ μ μ μ μμ μ¬μ©νμ¬ ν΄λμ€ νλμ νμ΄ν ν¨μλ₯Ό ν λΉν μλ μλ€.
// Bad
class Person {
// ν΄λμ€ νλ μ μ μ μ
name = "Lee";
sayHi = () => console.log(`Hi ${this.name}`);
}
const person = new Person();
person.sayHi(); // Hi Lee
μ΄λ
sayHi
ν΄λμ€ νλμ ν λΉν νμ΄ν ν¨μ λ΄λΆμμthis
λ₯Ό μ°Έμ‘°νλ©΄ μμ μ€μ½νμthis
λ°μΈλ©μ μ°Έμ‘° κ·Έλ λ€λ©΄ νμ΄ν ν¨μμ μμ μ€μ½νλ 무μμΌκ°?sayHi
ν΄λμ€ νλλ μΈμ€ν΄μ€ νλ‘νΌν°μ΄λ―λ‘ λ€μκ³Ό κ°μ μλ―Έμ΄λ€.
class Person {
constructor() {
this.name = 'Lee';
// ν΄λμ€κ° μμ±ν μΈμ€ν΄μ€(this)μ sayHi νλ‘νΌν°μ νμ΄ν ν¨μλ₯Ό ν λΉνλ€.
// λ°λΌμ sayHi νλ‘νΌν°λ μΈμ€ν΄μ€ νλ‘νΌν°λ€.
this.sayHi = () => console.log(`Hi ${this.name}`);
}
}
sayHi
ν΄λμ€ νλμ ν λΉν νμ΄ν ν¨μμ μμ μ€μ½νλ μ¬μ€ ν΄λμ€ μΈλΆμ§λ§this
κ° ν΄λμ€λ₯Ό μμ±ν μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°νλ€. λ°λΌμsayHi
ν΄λμ€ νλμ ν λΉν νμ΄ν ν¨μ λ΄λΆμμ μ°Έμ‘°νthis
λconstructor
λ΄λΆμthis
λ°μΈλ©κ³Ό κ°λ€.
νμ§λ§ ν΄λμ€ νλμ ν λΉν νμ΄ν ν¨μλ νλ‘ν νμ λ©μλκ° μλλΌ μΈμ€ν΄μ€ λ©μλκ° λλ€. λ°λΌμ λ©μλλ₯Ό μ μν λλ ES6 λ©μλ μΆμ½ ννμΌλ‘ μ μν ES6 λ©μλλ₯Ό μ¬μ©νλ κ²μ΄ μ’λ€.
// Good
class Person {
// ν΄λμ€ νλ μ μ μ μ
name = "Lee";
sayHi() { console.log(`Hi ${this.name}`); }
}
const person = new Person();
person.sayHi(); // Hi Lee
νμ΄ν ν¨μλ ν¨μ μ체μ
super
λ°μΈλ©μ κ°μ§ μλλ€. λ°λΌμ νμ΄ν ν¨μ λ΄λΆμμsuper
λ₯Ό μ°Έμ‘°νλ©΄this
μ λ§μ°¬κ°μ§λ‘ μμ μ€μ½νμsuper
λ₯Ό μ°Έμ‘°νλ€.
class Base {
constructor(name) {
this.name = name;
}
sayHi() {
return `Hi! ${this.name}`;
}
}
class Derived extends Base {
// νμ΄ν ν¨μμ superλ μμ μ€μ½νμΈ constructorμ superλ₯Ό κ°λ¦¬ν¨λ€.
sayHi = () => `${super.sayHi()} how are you doing?`
}
const derived = new Derived('Lee');
console.log(derived.sayHi()); // Hi! LEe how are you doing?
sayHi
ν΄λμ€ νλμ ν λΉν νμ΄ν ν¨μλ ν¨μμ체μsuper
λ°μΈλ©μ κ°μ§ μμΌλ―λ‘super
λ₯Ό μ°Έμ‘°ν΄λ μλ¬κ° λ°μνμ§ μκ³Derivedμ constructor
μsuper
λ°μΈλ©μ μ°Έμ‘°
νμ΄ν ν¨μλ ν¨μ μ체μ
arguments
λ°μΈλ©μ κ°μ§ μλλ€. λ°λΌμ νμ΄ν ν¨μ λ΄λΆμμarguments
λ₯Ό μ°Έμ‘°νλ©΄this
μ λ§μ°¬κ°μ§λ‘ μμ μ€μ½νμarguments
λ₯Ό μ°Έμ‘°νλ€.
(function () {
// νμ΄ν ν¨μ fooμ argumentsλ μμ μ€μ½νμΈ μ¦μ μ€ν ν¨μμ argumentsλ₯Ό κ°λ¦¬ν¨λ€.
const foo = () => console.log(arguments); // [Arguments] { '0': 1, '1': 2}
foo(3, 4);
},(1, 2));
// νμ΄ν ν¨μ fooμ argumentsλ μμ μ€μ½νμΈ μ μμ argumetnsλ₯Ό κ°λ¦¬ν¨λ€.
// νμ§λ§ μ μμλ arguments κ°μ²΄κ° μ‘΄μ¬νμ§ μλλ€. arguments κ°μ²΄λ ν¨μ λ΄λΆμμλ§ μ ν¨νλ€.
const foo = () => console.log(arguments);
foo(1, 2); // ReferenceError: arguments is not defined
Rest νλΌλ―Έν°(λλ¨Έμ§ λ§€κ°λ³μ)
λ 맀κ°λ³μ μ΄λ¦ μμ μΈκ°μ μ ...
μ λΆμ¬μ μ μν 맀κ°λ³μλ₯Ό μλ―Ένλ€.
Rest νλΌλ―Έν°(λλ¨Έμ§ λ§€κ°λ³μ)
λ ν¨μμ μ λ¬λ μΈμλ€μ λͺ©λ‘μ λ°°μ΄λ‘ μ λ¬λ°λλ€.
function foo(...rest) {
// 맀κ°λ³μ restλ μΈμλ€μ λͺ©λ‘μ λ°°μ΄λ‘ μ λ¬λ°λ Rest ν리미ν°λ€.
console.log(rest); // [1, 2, 3, 4, 5]
foo(1, 2, 3, 4, 5);
맀κ°λ³μμ
Rest νλΌλ―Έν°
λ ν¨κ» μ¬μ©ν μ μλ€. μ΄λ ν¨μμ μ λ¬λ μΈμλ€μ μμ°¨μ μΌλ‘ ν λΉλλ€.
function foo(param, ...rest) {
console.log(param); // 1
console.log(rest); // [2,3,4,5,]
}
foo(1, 2, 3, 4, 5);
Rest νλΌλ―Έν°
λ λ°λμ λ§μ§λ§ ν리미ν°μ΄μ΄μΌ νλ©° λ¨, νλλ§ μ μΈν μ μλ€.
function foo(...rest , param1, param2) {}
foo(1, 2, 3, 4, 5);
// SyntaxError: Rest parameter must ne last formal parameter
function foo(...rest1, ...rest2) { }
foo(1,2,3,4,5);
// SyntaxError: Rest parameter must ne last formal parameter
Rest νλΌλ―Έν°
λ ν¨μ μ μ μ μ μΈν 맀κ°λ³μ κ°μλ₯Ό λνλ΄λ ν¨μ κ°μ²΄μlength νλ‘νΌν°
μ μν₯μ μ£Όμ§ μλλ€.
function foo(..rest) {}
console.log(foo.length); // 0
function bar(x, ..rest) {}
console.log(bar.length); // 1
function baz(x, y, ..rest) {}
console.log(baz.length); // 2
ES5μμλ
κ°λ³ μΈμ ν¨μ
μ κ²½μ° λ§€κ°λ³μλ₯Ό ν΅ν΄ μΈμλ₯Ό μ λ¬λ°λ κ²μ΄ λΆκ°λ₯ νλ―λ‘argumetns
κ°μ²΄λ₯Ό νμ©νμ¬ μΈμλ₯Ό μ λ¬λ°μλ€.
argumetns
κ°μ²΄λ ν¨μ νΈμΆ μ μ λ¬λ μΈμλ€μ μ 보λ₯Ό λ΄κ³ μλμν κ°λ₯ν μ μ¬ λ°°μ΄ κ°μ²΄
μ΄λ©°, ν¨μ λ΄λΆμμ μ§μ λ³μμ²λΌ μ¬μ©ν μ μλ€.
μ μ¬ λ°°μ΄ κ°μ²΄
λ λ°°μ΄ λ©μλλ₯Ό μ¬μ©νλ €λ©΄Function.prototype.call
Function.prototype.apply
λ©μλλ₯Ό μ¬μ©ν΄arguments
κ°μ²΄λ₯Ό λ°°μ΄λ‘ λ³νν΄μΌ νλ λ²κ±°λ‘μ μλ€.
// 맀κ°λ³μμ κ°μλ₯Ό μ¬μ μ μ μ μλ κ°λ³ μΈμ ν¨μ
function sum() {
// κ°λ³ μΈμ ν¨μλ arguments κ°μ²΄λ₯Ό ν΅ν΄ μΈμλ₯Ό μ λ¬λ°λλ€.
console.log(arguments);
}
sum(1, 2); // {length: 2, '0': 1, '1': 2}
function sum() {
// μ μ¬ λ°°μ΄ κ°μ²΄μΈ arguments κ°μ²΄fmf λ°°μ΄λ‘ λ³ννλ€.
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
ES6μμλ
rest νλΌλ―Έν°
λ₯Ό μ¬μ©νμ¬ κ°λ³ μΈμ ν¨μμ λͺ©λ‘μ λ°°μ΄λ‘ μ§μ μ λ¬λ°μ μ μλ€. μ΄λ₯Ό ν΅ν΄ μ μ¬ λ°°μ΄ κ°μ²΄μΈarguments
κ°μ²΄λ₯Ό λ°°μ΄λ‘ λ³ννλ λ²κ±°λ‘μμ νΌν μ μλ€.
function sum(...args) {
// Rest νλ¦¬λ―Έν° argμλ λ°°μ΄ [1, 2, 3, 4, 5]κ° ν λΉλλ€.
return arg.reduce((pre, cur) => pre + cur, 0);
}
console.log(sum(1,2,3,4,5)); // 15
ν¨μ ES6 λ©μλλ
Rest νλΌλ―Έν°
μarguments κ°μ²΄
λ₯Ό λͺ¨λ μ¬μ©ν μ μλ€. νμ§λ§ νμ΄ν ν¨μ μ체μarguments κ°μ²΄
λ₯Ό κ°μ§ μλλ€. λ°λΌμ νμ΄ν ν¨μλ‘ κ°λ³ μΈμ ν¨μλ₯Ό ꡬνν΄μΌ ν λλ λ°λμRest νλΌλ―Έν°
λ₯Ό μ¬μ©ν΄μΌ νλ€.
ν¨μλ₯Ό νΈμΆν λ 맀κ°λ³μμ κ°μλ§νΌ μΈμλ₯Ό μ λ¬νλ κ²μ΄ λ°λμ§ νμ§λ§ κ·Έλ μ§ μμκ²½μ°μλ μλ°μ€ν¬λ¦½νΈ μμ§μ΄ 맀κ°λ³μμ κ°μμ μΈμμ κ°μλ₯Ό 체ν¬νμ§ μκΈ° λλ¬Έμ μλ¬κ° λ°μνμ§ μλλ€.
μΈμκ° μ λ¬λμ§ μμ 맀κ°λ³μμ κ°μundefined
λ€.
function sum(x, y) {
return x + y;
}
console.log(sum(1)); // NaN
μΈμκ° μ λ¬λμ§ μμ κ²½μ°μ 맀κ°λ³μμ κΈ°λ³Έκ°μ ν λΉν νμκ° μλ€.
function sum(x, y) {
// μΈμκ° μ λ¬λμ§ μμ 맀κ°λ³μμ κ°μ΄ undefinedμΈ κ²½μ° κΈ°λ³Έκ°μ ν λΉνλ€.
x = x || 0;
y = y || 0;
return x + y;
}
console.log(sum(1, 2)); // 3
console.log(sum(1)); // 1
ES6μμ λμ λ 맀κ°λ³μ κΈ°λ³Έκ°μ μ¬μ©νλ©΄ ν¨μ λ΄μμ μννλ μΈμ μ²΄ν¬ λ° μ΄κΈ°νλ₯Ό κ°μνν μ μλ€.
function sum(x = 0, y = 0) {
return x + y;
}
console.log(sum(1,2)); // 3
console.log(sum(1)); // 1
function logName(name = 'Lee') {
console.log(name);
}
logName(); // Lee
logName(undefined); // Lee
logName(null); // null
Rest νλΌλ―Έν°
μλ κΈ°λ³Έκ°μ μ§μ ν μ μλ€.
function foo(...rest = []) {
console.log(rest);
}
// SyntaxError: Rest paramter may not have a default initializer