ν°μ€ν 리 λ·°
[JavaScript] ES6 ν¨μμ μΆκ° κΈ°λ₯
κ°λ°κ°κ΅΄πΈ 2022. 7. 29. 01:31ν¨μμ ꡬλΆ
ES6 μ΄μ μ ν¨μμ λͺ¨λ ν¨μλ μ¬μ© λͺ©μ μ λ°λΌ λͺ νν ꡬλΆμ΄ μμ΄ νΈμΆ λ°©μμ νΉλ³ν μ μ½ μμ΄ λ€μν ννλ‘ νΈμΆμ΄ κ°λ₯νμ΅λλ€. λν, μμ±μ ν¨μκ° μλ ν¨μκ° λΆνμν νλ‘ν νμ κ°μ²΄λ₯Ό μμ±νκΈ° λλ¬Έμ νΌλμ€λ¬μ°λ©° μ€μλ₯Ό μ λ°ν κ°λ₯μ±μ΄ μκ³ μ±λ₯μλ μ’μ§ μμμ΅λλ€.
λ°λΌμ ES6μμλ ν¨μλ₯Ό μ¬μ© λͺ©μ μ λ°λΌ μΈ κ°μ§ μ’ λ₯λ‘ λͺ νν ꡬλΆνμ΅λλ€.
ES ν¨μμ κ΅¬λΆ | 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 this.x; },
// barμ λ°μΈλ©λ ν¨μλ λ©μλκ° μλ μΌλ° ν¨μ
bar: function () { return this.x; }
};
console.log(obj.foo()); // 1
console.log(bar.foo()); // 1
new obj.foo(); // TypeError
new obj.bar(); // bar {}
obj.foo.hasOwnProperty('prototype'); // false
obj.bar.hasOwnProperty('prototype'); // true
// λ©μλμ super ν€μλ μ¬μ©
const base = {
name: 'Lee',
sayHi() {
return `Hi! ${this.name}`;
}
};
const derived = {
__proto__ : base,
// sayHiμ [[HomeObejct]]λ sayHiκ° λ°μΈλ©λ κ°μ²΄μΈ derivedλ₯Ό κ°λ¦¬ν΄
// superλ sayHiμ [[HomeObejct]]μ νλ‘ν νμ
μΈ baseλ₯Ό κ°λ¦¬ν΄
sayHi() {
return `${super.sayHi()}. how are you doing?`;
}
};
console.log(derived.sayHi()); // Hi! Lee. how are you doing?
- λ©μλλ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ non-contructorλΌμ μμ±μ ν¨μλ‘μ νΈμΆ λΆκ°λ₯
- μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμ΄μ prototype νλ‘νΌν°κ° μκ³ νλ‘ν νμ λ μμ±νμ§ μμ
- λ©μλλ μμ μ λ°μΈλ©ν κ°μ²΄λ₯Ό κ°λ¦¬ν€λ λ΄λΆ μ¬λ‘― [[HomeObject]]λ₯Ό κ°κΈ° λλ¬Έμ super ν€μλ μ¬μ© κ°λ₯
μ΄μ²λΌ ES6 λ©μλλ λ³Έμ°μ κΈ°λ₯(super)μ μΆκ°νκ³ μλ―Έμ μΌλ‘ λ§μ§ μλ κΈ°λ₯(constructor)μ μ κ±°νμμ΅λλ€.
λ°λΌμ λ©μλλ₯Ό μ μν λ νλ‘νΌν° κ°μΌλ‘ μ΅λͺ ν¨μ ννμμ ν λΉνλ μ΄μ μ λ°©μμ κΆμ₯λμ§ μμ΅λλ€.
νμ΄ν ν¨μ
νμ΄νν¨μλ function ν€μλ λμ νμ΄ν(=>, fat arrow)λ₯Ό μ¬μ©νμ¬ κΈ°μ‘΄μ ν¨μ μ μ λ°©μλ³΄λ€ κ°λ΅νκ² ν¨μλ₯Ό μ μν μ μμ΅λλ€. λ΄λΆ λμλ κΈ°μ‘΄ ν¨μλ³΄λ€ κ°λ΅νμ¬ μ½λ°± ν¨μ λ΄λΆμμ thisκ° μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν λμμΌλ‘ μ¬μ©λ©λλ€.
νμ΄ν ν¨μ μ μ
νμ΄ν ν¨μ μ μ λ¬Έλ²μ λ€μκ³Ό κ°μ΅λλ€.
ν¨μ μ μ
- νμ΄ν ν¨μλ ν¨μ μ μΈλ¬ΈμΌλ‘ μ μν μ μκ³ ν¨μ ννμμΌλ‘ μ μν΄μΌ ν¨
const multiply = (x, y) => x * y;
multiply(2, 3); // 6
맀κ°λ³μ μ μ
- 맀κ°λ³μκ° μ¬λ¬κ°μΈ κ²½μ° μκ΄νΈ () μμ 맀κ°λ³μλ₯Ό μ μΈ
- 맀κ°λ³μκ° 1κ°λΌλ©΄ μκ΄νΈ () μλ΅ κ°λ₯
- 맀κ°λ³μκ° μλ€λ©΄ μκ΄νΈ () μλ΅ λΆκ°λ₯
const arrow = (x, y) => { ... };
const arrow = x => { ... };
const arrow = () => { ... );
ν¨μ λͺΈμ²΄ μ μ
- ν¨μ λͺΈμ²΄κ° νλμ λ¬ΈμΌλ‘ ꡬμ±λλ©° ν¬νμμ΄λΌλ©΄ ν¨μ λͺΈμ²΄λ₯Ό κ°μΈλ μ€κ΄νΈ {}λ₯Ό μλ΅ κ°λ₯
- ν¨μ λͺΈμ²΄κ° νλμ λ¬ΈμΌλ‘ ꡬμ±λμ΄λ ννμμ΄ μλ λ¬Έμ κ°μΌλ‘ ννλ μ μκΈ° λλ¬Έμ μ€κ΄νΈ {} μλ΅ λΆκ°λ₯
- κ°μ²΄ 리ν°λ΄μ λ°ννλ κ²½μ° κ°μ²΄ 리ν°λ΄μ μκ΄νΈ ()λ‘ κ°μΈ μ£Όμ΄μΌν¨
- ν¨μ λͺΈμ²΄κ° μ¬λ¬ κ°μ λ¬ΈμΌλ‘ ꡬμ±λλ€λ©΄ ν¨μ λͺΈμ²΄λ₯Ό κ°μΈλ μ€κ΄νΈ {} μλ΅ λΆκ°λ₯
- νμ΄ν ν¨μλ μ¦μ μ€ν ν¨μλ‘ μ¬μ© κ°λ₯
- νμ΄ν ν¨μλ μΌκΈ κ°μ²΄μ΄λ―λ‘ map, filter, reduce κ°μ κ³ μ°¨ ν¨μμ μΈμλ‘ μ λ¬ κ°λ₯
// ννμμΈ νλμ λ¬Έ
const power = x => x ** 2;
power(2); // -> 4
// μ ννμ λ€μκ³Ό λμΌνλ€.
const power = x => { return x ** 2; };
// ννμμ΄ μλ λ¬Έ
const arrow = () => { const x = 1; };
// κ°μ²΄ 리ν°λ΄ λ°ν
const create = (id, content) => ({ id, content });
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.
// κ³ μ°¨ ν¨μ
[1, 2, 3].map(v => v * 2); // -> [ 2, 4, 6 ]
νμ΄ν ν¨μμ μΌλ° ν¨μμ μ°¨μ΄
1. νμ΄ν ν¨μλ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ non-constructor
- νμ΄ν ν¨μλ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμΌλ―λ‘ prototype νλ‘νΌν°κ° μκ³ νλ‘ν νμ λ μμ±νμ§ μμ
2. μ€λ³΅λ 맀κ°λ³μ μ΄λ¦μ μ μΈν μ μμ
- μΌλ° ν¨μλ μ€λ³΅λ 맀κ°λ³μ μ΄λ¦μ μ μΈν΄λ μλ¬ λ°μ X (strict mode μ μΈ)
- νμ΄ν ν¨μμμλ μ€λ³΅λ 맀κ°λ³μ μ΄λ¦μ μ μΈνλ©΄ SyntaxErrorκ° λ°μ
3. νμ΄ν ν¨μλ ν¨μ μ체μ this, arguments, super, new.target λ°μΈλ©μ κ°μ§ μμ
- νμ΄ν ν¨μ λ΄λΆμ μ€μ²©ν¨μ(νμ΄ν ν¨μ λ΄λΆμ νμ΄ν ν¨μ)μμ this, arguments, super, new.targetμ μ°Έμ‘°νλ©΄
μ€μ½ν 체μΈμ ν΅ν΄ μμ μ€μ½νμ this, arguments, super, new.targetμ μ°Έμ‘°ν¨
this
νμ΄ν ν¨μκ° μΌλ° ν¨μμ ꡬλ³λλ κ°μ₯ ν° νΉμ§μ thisμ λλ€.
- νμ΄ν ν¨μ : ν¨μ μ체μ this λ°μΈλ©μ κ°μ§ μμμ νμ΄ν λ΄λΆμμ thisλ₯Ό μ°Έμ‘°νλ©΄ μμ μ€μ½νμ thisλ₯Ό κ·Έλλ‘ μ°Έμ‘°ν©λλ€. (lexical this, λ§μΉ λ μ컬 μ€μ½νμ κ°μ΄ thisκ° ν¨μκ° μ μλ μμΉμ μν΄ κ²°μ λ¨)
- μΌλ° ν¨μ : λͺ¨λ ν¨μ λ΄λΆμ 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']));
// νμ΄ν ν¨μλ₯Ό ν΅ν΄ ν΄κ²°
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 λ°μΈλ©μ κ°μ§ μκΈ° λλ¬Έμ call, apply, bind λ©μλλ₯Ό μ¬μ©ν΄λ νμ΄ν λ΄λΆμ thisλ₯Ό κ΅μ²΄ν μ μμ΅λλ€. λ°λΌμ λ©μλλ₯Ό νμ΄ν ν¨μλ‘ μ μνλ κ²μ νΌν΄μΌ ν©λλ€.
super
νμ΄ν ν¨μλ ν¨μ μ체μ 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?
arguments
νμ΄ν ν¨μλ ν¨μ μ체μ 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λ μμ μ€μ½νμΈ μ μμ argumentsλ₯Ό κ°λ¦¬ν¨λ€.
// νμ§λ§ μ μμλ 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);
κΈ°λ³Έ λ¬Έλ²
// μΌλ° 맀κ°λ³μμ ν¨κ» μ¬μ©
function bar(param1, param2, ...rest) {
console.log(param1); // 1
console.log(param2); // 2
console.log(rest); // [ 3, 4, 5 ]
}
bar(1, 2, 3, 4, 5);
// Rest νλΌλ―Έν°λ λ§μ§λ§ νλΌλ―Έν°μ¬μΌν¨
function foo(...rest, param1, param2) { }
foo(1, 2, 3, 4, 5);
// SyntaxError: Rest parameter must be last formal parameter
// Rest νλΌλ―Έν°λ λ¨ νλλ§ μ μΈ κ°λ₯
function foo(...rest1, ...rest2) { }
foo(1, 2, 3, 4, 5);
// SyntaxError: Rest parameter must be last formal parameter
// length νλ‘νΌν°μ μν₯ X
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
- μΌλ° 맀κ°λ³μμ ν¨κ» μ¬μ© κ°λ₯νλ©° μμ°¨μ μΌλ‘ 맀κ°λ³μμ Rest νλΌλ―Έν°μ ν λΉλ¨
- λ°λμ λ§μ§λ§ νλΌλ―Έν°μ΄μ΄μΌ ν¨
- λ¨ νλλ§ μ μΈ ν μ μμ
- ν¨μ μ μ μ μ μΈν 맀κ°λ³μ κ°μλ₯Ό λνλ΄λ ν¨μ κ°μ²΄μ length νλ‘νΌν°μ μν₯μ μ£Όμ§ μμ
Rest νλΌλ―Έν°μ arguments κ°μ²΄
ES6μμλ Rest ννλ―Έν°λ₯Ό νμ©ν΄ κ°λ³ μΈμ ν¨μμ μΈμ λͺ©λ‘μ λ°°μ΄λ‘ μ§μ μ λ¬λ°μ μ μμ΄ μ μ¬ λ°°μ΄ κ°μ²΄μΈ arguments κ°μ²΄λ₯Ό λ°°μ΄λ‘ λ³ννλ λ²κ±°λ‘μμ νΌν μ μμ΅λλ€.
function sum(...args) {
// Rest νλΌλ―Έν° argsμλ λ°°μ΄ [1, 2, 3, 4, 5]κ° ν λΉλλ€.
return args.reduce((pre, cur) => pre + cur, 0);
}
console.log(sum(1, 2, 3, 4, 5)); // 15
맀κ°λ³μ κΈ°λ³Έκ°
ES6μμ λμ λ 맀κ°λ³μ κΈ°λ³Έκ°μ μ¬μ©νλ©΄ ν¨μ λ΄μμ μννλ μΈμ μ²΄ν¬ λ° μ΄κΈ°νλ₯Ό κ°μνν μ μμ΅λλ€.
// 맀κ°λ³μλ₯Ό μ λ¬νμ§ μμ κ²½μ°
function sum(x = 0, y = 0) {
return x + y;
}
console.log(sum(1, 2)); // 3
console.log(sum(1)); // 1
// 맀κ°λ³μμ undefinedλ₯Ό μ λ¬ν κ²½μ°
function logName(name = 'Lee') {
console.log(name);
}
logName(); // Lee
logName(undefined); // Lee
logName(null); // null
// Rest νλΌλ―Έν°μλ κΈ°λ³Έκ°μ μ§μ ν μ μμ
function foo(...rest = []) {
console.log(rest);
}
// SyntaxError: Rest parameter may not have a default initializer
// length νλ‘νΌν°μ arguments κ°μ²΄μ μν₯ X
function sum(x, y = 0) {
console.log(arguments);
}
console.log(sum.length); // 1
sum(1); // Arguments { '0': 1 }
sum(1, 2); // Arguments { '0': 1, '1': 2 }
- 맀κ°λ³μμ μΈμλ₯Ό μ λ¬νμ§ μμ κ²½μ°μ undefinedλ₯Ό μ λ¬ν κ²½μ°μλ§ μ ν¨ν¨
- Rest νλΌλ―Έν°μλ κΈ°λ³Έκ°μ μ§μ ν μ μμ
- ν¨μ μ μ μ μ μΈν 맀κ°λ³μ κ°μλ₯Ό λνλ΄λ ν¨μ κ°μ²΄μ length νλ‘νΌν°μ arguments κ°μ²΄μ μλ¬΄λ° μν₯μ΄ μμ
[μΆμ²] λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive
'JavaScript > λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JavaScript] μλ°μ€ν¬λ¦½νΈμ λ°°μ΄ λ©μλμ κ³ μ°¨ ν¨μ (0) | 2022.08.01 |
---|---|
[JavaScript] λ°°μ΄ (0) | 2022.07.31 |
[JavaScript] ν΄λμ€ (0) | 2022.07.28 |
[JavaScript] ν΄λ‘μ (0) | 2022.07.27 |
[JavaScript] μ€ν 컨ν μ€νΈ (0) | 2022.07.27 |
- Total
- Today
- Yesterday
- μ΄λΆνμ
- http
- git
- μλ°
- νλ‘κ·Έλλ¨Έμ€
- μ½λ©ν μ€νΈ
- λ μ컬 νκ²½
- μΉ΄μΉ΄μ€ μΈν΄
- λ°±μ€
- λμμΈ ν¨ν΄
- κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°
- μκ³ λ¦¬μ¦
- 2019 μΉ΄μΉ΄μ€ κ°λ°μ κ²¨μΈ μΈν΄
- ν¬ν¬μΈν°
- λͺ¨λ μλ°μ€ν¬λ¦½νΈ deep dive
- JavaScript
- map
- νλ‘νΌν°
- λ°±μ€ javascript
- μλ°μ€ν¬λ¦½νΈ
- λ€νΈμν¬
- fp
- μ μ λ³μ
- νλ‘ν μ½
- Baekjoon
- TDD
- λ°±μ€ node.js
- λ€μ΄λλ―Ή νλ‘κ·Έλλ°
- μ΄μ체μ
- ν¨μν νλ‘κ·Έλλ°
μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |