728x90
모던 자바스크립트 Deep Dive을 요약한 내용입니다.
25.1 클래스는 프로토타입의 문법적 설탕인가?
- 자바스크립트는 강력한 객체지향 프로그래밍 능력을 지니고 있다.
- 프로타입 기반 객체지향 언어는 클래스가 필요 없는 객체지향 프로그래밍 언어이다.
- ES5에서는 클래스 없이도 다음과 같이 생성자 함수와 프로토타입을 통해 객체지향 언어의 상속을 구현할 수 있다.
- var Person = (function() { function Person(name) { this.name = name } Person.prototype.sayHi = function () { console.log('Hi! My name is ' + this.name) } return Person }) var me = new Person('Lee') me.sayHi()
- 클래스 기반 언어에 익숙한 프로그래머들은 프로토타입 기반 프로그래밍 방식에 혼란을 느낄수 있으며, 자바스크립트를 어렵게 느끼게 하는 하나의 장벽처럼 인식되었다.
- ES6에서 도입된 클래스는 기존 프로토타입 기반 객체지향 프로그래밍보다 자바나 C#과 같은 클래스기반 객체지향 프로그래밍에 익숙한 프로그래머가 더욱 빠르게 학습할 수 있도록 도와준다.
- 자바스크립트의 클래스는 함수이며 기존 프로토타입 기반 패턴을 클래스 기반 패턴처럼 사용할 수 있도록 하는 문법적 설탕이라고 볼수 있다.
- 클래스와 생성자 함수는 모두 프로토타입 기반의 인스턴스를 생성하지만 정확히 동일하게 동작하지는 않는다.
- 클래스는 생성자 함수와 매우 유사하게 동작하지만 몇가지 차이가 있다.
- 클래스는 new 연산자 없이 호출하면 에러가 발생한다.
- 생성자 함수는 일반 함수로서 호출
- 클래스는 상속을 지원하는 extends와super 키워드를 제공한다.
- 생성자 함수는 지원 안함
- 클래스는 호이스팅이 발생하지 않는 것처럼 동작한다.
- 클래스 내의 모든 코드에는 암묵적으로 strict mode가 지정되어 실행되면 strict mode를 해제할 수 없다.
- 클래스는 constructor, 프로토타입 메서드, 정적 메서드는 모드 프로퍼티 어트리뷰트 [[Enumerable]]의 값이 false다
- 클래스는 new 연산자 없이 호출하면 에러가 발생한다.
25.2 클래스의 정의
- 클래스는 class 키워드를 사용하여 정의한다.
- 25-02
- 클래스를 표현식으로 정의할 수 있다는 것은 클래스가 값으로서 사용할 수 있는 일급 객체이다.
- 클래스 몸체에는 0개 이상의 메서드만 정의할 수 있다.
- 25-04
25.3 클래스 호이스팅
- 클래스는 함수로 평가된다.
- 25-05
- 클래스는 클래스 정의 이전에 참조할 수 없다.
- 25-06
- 클래스 선언문은 마치 호이스팅이 발생하지 않는 것처럼 보이나 그렇지 않다.
- 클래스 선언문도 변수 선언, 함수 정의와 마찬가지로 호이스팅이 발생한다.
- 클래스는 let, const 키워드로 선언한 변수처럼 호이스팅된다.
25-07
25.4 인스턴스 생성
- 클래스는 생성자 함수이며 new 연산자와 함께 호출되어 인스턴스를 생성한다.
- 25-08
25.5 메서드
- 클래스 몸체에는 0개 이상의 메서드만 선언할 수 있다.
- 클래스 몸체에서 정의할 수 있는 메서드는 constructor, 프로타입 메서드, 정적 메서드의 세가지가 있다.
25.5.1 constructor
- constructor는 인스턴스를 생성하고 초기화하기 위한 특수한 메서드다.
- 25-11
- 클래스의 내부를 들여다보기 위해 크롬 브라주어의 개발자 도구에서 실행해보자.
- 클래스는 인스턴스를 생성하기 위한 생성자 함수이다.
25-12
- constructor는 클래스 내에 최대 한개만 존재할 수 있다.
- 25-15
- constructor는 별도의 반환문을 갖지 않아야 한다.
- 암묵적으로 this를 반환한다.
- this가 아닌 다른 객체를 명시적으로 반환하면 return문에 명시한 객체가 반환된다.
25-20
- 명시적으로 원시값을 반환하면 원시값 반환은 무시되고 암묵적으로 this가 반환된다.
- 25-21
25.5.2 프로토타입 메서드
- 클래스 몸체에서 정의한 메서드는 생성자 함수에 의해 객체 생성 방식과는 다르게 클래스의 prototype 프로퍼티에 메서드를 추가하지 않아도 기본적으로 프로토타입 메서드가 된다.
- 25-23
- 클래스는 생성자 함수와 같이 인스턴스를 생성하는 생성자 함수라고 볼수 있다.
- 클래스는 생성자 함수와 마찬가지로 프로토타입 기반의 객체 생성 메커니즘이다.
25.5.3 정적 메서드
- 클래스에서는 메서드에 static 키워드를 붙이면 정적 메서드가 된다.
- 25-26
- 정적 메서드는 인스턴스로 호출할 수 없다.
- 25-28
25.5.4 정적 메서드와 프로토타입 메서드의 차이
- 정적 메서드와 프로토타입 메서드의 차이
- 정적 메서드와 프로토타입 메서드는 자신이 속해 있는 프로토타입 체인이 다르다.
- 정적 메서드는 클래스로 호출하고 프로토타입 메서드는 인스턴스로 호출한다.
- 정적 메서드는 인스턴스 프로퍼티를 참조할 수 없지만 프로토타입 메서드는 프로퍼티를 참조할 수 있다.
25-29
25-30
25.5.5 클래스에서 정의한 메서드의 특징
- function 키워드를 생략한 메서드 축약표현을 사용한다.
- 객체 리터럴과는 다르게 클래스에서 메서드를 정의할 때는 콤마가 필요 없다.
- 암묵적으로 strict mode로 실행된다.
- for … in 문이나 Object.keys 메서드 등으로 열겨할 수 없다.
- 내부 메서드 [[Construct]]를 갖지 않는 non-constructor다
- new 연산자와 함께 호출할 수 없다.
25.6 클래스의 인스턴스 생성 과정
- 인스턴스 생성과 this 바인딩
- new 연산자와 함께 클래스를 호출하면 consturctor의 내부 코드가 실행되기에 앞서 암묵적으로 빈객체가 생성된다.
- 암묵적으로 생성된 빈 객체는 this에 바인딩된다.
- consturctor 내부의 this는 클래스가 생성한 인스턴스를 가리킨다.
- 인스턴스 초기화
- constructor의 내부 코드가 실행되어 this에 바인딩되어 있는 인스턴스를 초기화한다.
- 인스턴스 반환
- 클래스의 모든 처리가 끝나면 완성된 인스턴스가 바인딩된 this가 암묵적으로 반환된다.
25-32
25.7 프로퍼티
25.7.1 인스턴스 프로퍼티
- 인스턴스 프로퍼티는 consturctor 내부에서 정의해야 한다.
- 25-33
25.7.2 접근자 프로퍼티
- 접근자 프로퍼티는 자체적으로는 값을 갖지 않고 다른 데이터 프로퍼티의 값을 읽거나 저장할 때 사용하는 접근자 함수로 구성된 프로퍼티다.
- 25-35
- 접근차 프로퍼티는 클래스에서도 사용할 수있다.
- 25-36
25.7.3 클래스 필드 정의 제안
- 자바스크립트의 클래스 몸체에는 메서드만 선언할 수 있다.
- 25-39
25.7.4 private 필드 정의 제안
- 인스턴스 프로퍼티는 인스턴스를 통해 클래스 외부에서 언제나 참조할 수 있다.
- 언제나 public 이다.
25-48
- private 필드의 선두에는 #을 붙여준다. (TC39 프로세스의 stage 3에 새로운 표준 사항이 제안되어 있다.)
- 25-50
- 접근자 프로퍼티를 통해 간접적으로 접근하는 방법은 유효하다.
- 25-51
- private 필드는 반드시 클래스 몸체에 정의해야한다.
- 25-52
25.7.5 static 필드 정의 제안
- static 키워드를 사용하여 정적 필드를 정의할 수는 없다. (TC39 프로세스의 stage 3에 새로운 표준 사항이 제안되어 있다.)
- 25-53
25.8 상속에 의한 클래스 확장
25.8.1 클래스 상속과 생성자 함수 상속
- 클래스는 상속을 통해 기존 클래스를 확장할 수 있는 문법이 기본적으로 제공되지만 생성자 함수는 그렇지 않다.
- 25-54
25.8.2 extends 키워드
- 상속을 통해 클래스를 확장하려면 extends 키워드를 사용하여 상속받을 클래스를 정의한다.
- 25-56
25.8.3 동적 상속
- extends 키워드는 클래뿐만 아니라 생성자 함수를 상속받아 클래스를 확장할 수도 있다.
- 25-57
- 동적으로 상속받을 대상을 결정할 수 있다.
- 25-58
25.8.4 서브클래스의 constructor
25.8.5 super 키워드
- super 는 다음과 같이 동작한다.
- super를 호출하면 수퍼클래스의 consturtor를 호출한다.
- super를 참조하면 수퍼클래스의 메서드를 호출할 수 있다.
super 호출
- super를 호출하면 수퍼클래스의 consturtor를 호출한다.
- 25-63
- super를 사용할 때 주의 사항
- 서브클래스에서 constructor를 생략하지 않은 경우 서브클래스의 constructor에서는 반드시 super를 호출 해야한다.
- 25-65
- 서브클래스의 constructor에서 super를 호출하기 전에는 this를 참조할 수 없다.
- 25-66
- super는 반드시 서브클래스의 constructor에서만 호출한다.
- 서브클래스가 아닌 클래스의 constructor나 함수에서 super를 호출하면 에러가 발생한다.
25-67
super 참조
- 메서드 내에서 super를 참조하면 수퍼클래스의 메서들르 호출할 수 있다.
- 25-68
728x90