- Spread / Rest
- Destructing(구조 분해)
- 객체지향프로그래밍 - Class / Instance
- this 키워드
배열이나 객체의 데이터들을 풀어서 사용하기 위한 문법
let arr = [10, 20, 30, 40]; console.log(arr); // [10, 20, 30, 40] console.log(...arr); // 10 20 30 40
함수의 매개변수로 여러개의 인자를 배열로 묶어서 받을 수 있는 문법
function sum(...numbers) { return numbers.reduce((acc, cur) => acc + cur); } console.log( sum(10, 20, 30, 40) ); // 100
let first = ['one', 'two'];
let seconds = ['three', 'four'];
let concatArr = [...first, ...seconds];
// ['one', 'two', 'three', 'four']
let arr = [1, 2, 3];
let copyArr = [...arr];
arr.push(4);
console.log(arr, copyArr); // [1,2,3,4] , [1,2,3]
let obj1 = { foo: 'bar', x: 42 };
let obj2 = { foo: 'baz', y: 13 };
let cloneObj = { ...obj1 };
let mergedObj = { ...obj1, ...obj2 };
function myFun(a, b, ...args) {
console.log('a', a);
console.log('b', b);
console.log('other', args );
}
myFun('one', 'two', 'three', 'four');
// 'a', 'one'
// 'b', 'two'
// 'other', ['three', 'four']
구조 분해 할당 구문은 배열이나 객체의 속성을 해체
하여 그 값을 개별 변수에 담을 수 있는 표현식이다.
구조분해 문법을 사용하지 않는다면 배열의 요소들을 아래와 같이 담아줄 수 있다.
let arr = [1, 2, 3, 4];
let num1 = arr[0];
let num2 = arr[1];
let num3 = arr[2];
let num4 = arr[3];
여기서 구조분해 문법을 사용하면
let arr = [1, 2, 3 ,4];
let [num1, num2, num3, num4] = arr;
console.log(num1, num2, num3, num4); // 1, 2, 3, 4
위처럼 배열의 요소들을 분해하여 각각 변수에 담아준다.
선언에서 분리한 할당
let a, b; [a, b] = [1, 2]; console.log(a, b); // 1, 2
default value
let a, b; [a=10, b=20] = [50]; console.log(a, b); // 50, 20
change value
let a = 10; let b = 20; [a, b] = [b, a]; console.log(a, b); // 20, 10
return array
function a() { return [10, 20]; } let a, b; [a, b] = a(); console.log(a, b); // 10, 20
반환 값 무시
let [num1, , num3] = [10, 20, 30]; console.log(num1, num3); // 10, 30;
rest
let [num1, ...args] = [1, 2, 3, 4]; console.log(num1, args); // 1, [2, 3, 4]
객체지향프로그래밍에는 실제 세계에서 모델이되는 청사진을 만들고 그 창사진을 바탕으로 여러개의 객체를 만들어 낸다.
여기서 청사진은 Class라 할수 있고, 찍어내는 객체들을 Instance라고 할 수 있다.
자바스크립트에서는 이미 객체지향프로그래밍(이하 OOP)와는 상관없이 객체를 사용하고있다.
그러므로 인스턴스와 객체는 이제 구분되어 말하겠다.
객체를 만드는방법은 일반적인 함수를 정의하듯 만든다.
하지만 만들어진 이 함수를 사용하는 방법이 다르다.
그냥 실행하여 만드는것이 아닌 new
키워드를 이용해여 만든다.
이를 통해 만들어진 객체를 Instance
라고 한다.
그렇다면 일반함수와 클래스를만드는 함수는 어떻게 구문하는가?
es6
이전의 방법으로는 클래스함수는 첫글자를 대문자와 일반명사로 구분하여 작성하고 일반함수는 첫글자 소문자와 카멜케이스, 동사로 구분하여 작성했다. 하지만 es6
이후에는 class
키워드가 생겨서 좀더 명확한 구분이 가능해졌다.
class
도 결국 함수이다. 좀더 특별한
함수.
그래서 선언식과 표현식이 존재한다.
// 선언식 class Car { constructor(kind, color) { this.kind = kind; this.color = color; } } // 표현식 let Car = class { constructor(kind, color) { this.kind = kind; this.color = color; } }
클래스는 일반 함수와다르게 선언식이라도 호이스팅이 일어나지 않는다.
// 인스턴스 생성 let mini = new Car('mini', 'white');
클래스를 정의할때 해당 인스턴스의 속성과 메서드를 정의할 수 있다.
속성은 차로 생각할 때 브랜드, 이름, 색상과 같은 특징을 정하고
메서드는 달리다, 멈추다, 시도을건다 등의 행위를 나타낼수 있다.
this
는 함수 실행시 호출방법에 의해 결정되는 특별한 객체다.
함수 실행시 결정
되므로, 실행되는 맥락에 따라 this
는 다르게 결정된다.
this
는 어떻게 실행되는지가 중요한데 아래처럼 나눌 수 있다.
- Function
test();
- Method
obj.test();
- new
new Car();
- call, apply
obj.call(); obj.apply();
패턴 | 바인딩 | 내용 |
---|---|---|
Method | 부모 객체 | 객체의 값과 연관된 메서드를 묶어서 사용할때 사용 |
new | 새롭게 생성된 인스턴스 객체 | 객체 지향 프로그래밍에서 사용 |
.call, .apply | 첫번째 인자로 전달된 객체 | this값을 특정할 때 사용 |
Arrow Function은 this가 항상 전역객체로 고정되어있으니 주의하여 사용하고, 메서드로 함수를 정의할때 화살표 함수는 사용 안한다.