# ES2015 Class
# Class 정의
Class는 사실 함수. 함수가 함수 표현식/함수 선언 으로 정의할 수 있듯이 class도 class표현식/선언식 두 가지 방법으로 만들 수 있음.
- Class 선언
class Nemo {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
함수 선언과 클래스 선언의 차이점은 함수 선언의 경우에만 호이스팅이 일어난다는 것.
위처럼 class Nemo로 만들고 그 위에서 new Nemo()
이렇게 부르면 ReferenceError를 뿜는다.
- Class 표현식
var Nemo = class { // 이름 안가짐
constructor...
}
var Nemo = class Nemo { // 이름 가짐
constructor...
}
# Class body와 method 정의
- Strict mode: 클래스 선언과 표현식의 본문은 strict mode에서 실행됨
- Construct: class로 생성된 객체를 생성하고 초기화하기 위한 특수한 메소드. 부모 클래스의 constructor를 호출하기 위해 super키워드 사용가능
# prototype methods
class Nemo {
constructor...
get area() {
return this.calcArea()
}
calcArea() {
return this.height * this.width;
}
}
# Static methods
클래스를 위한 정적 메소드 정의. 클래스의 인스턴스화 없이 호출되며, 클래스의 인스턴스에서는 호출 불가. 어플리케이션을 위한 유틸리티 함수를 생성하는데 주로 사용. e.g. Point.distance(인스턴스1, 인스턴스2)로 포인트간의 거리 구하기
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
static distance(a, b) {
const dx = a.x - b.x;
const dy = a.y - b.y;
return Math.sqrt(dx*dx + dy*dy);
}
}
const p1 = new Point(5, 5);
const p2 = new Point(10, 10);
console.log(Point.distance(p1, p2));
# extends로 클래스 상속(sub classing), 상위 클래스 호출
class Dog extends Animal {
speak() {
super.speak();
console.log()
}
}
# Constructor
class Square extends Polygon {
constructor(length) {
// length로 다각형의 넓이와 높이를 정의하기 위해 부모클래스의 생성자를 호출합니다.
super(length, length);
// Note: 파생 클래스에서, 'this'를 사용하기 전에는 반드시 super()를
// 호출하여야 합니다. 그렇지 않을 경우 참조에러가 발생합니다.
this.name = 'Square';
}
get area() {
return this.height * this.width;
}
set area(value) {
this.area = value;
}
}