[ES6] 6. Classsugar syntax
ES6에서자바스크립트에는존재하지않았던클래스(Class)가 도입되었다. 자
바스크립트에대해잘모르는사람들이Java에서의클래스와똑같은기능을
하는녀석인줄알고 많이혼동한다. 자바스크립트는기본적으로프로토타입
기반의언어이기 때문에새로도입된이클래스도프로토타입기반이다. 객체
지향을흉내내고 있지만, 그 내부는여전히프로토타입으로구성되어있는것
이다. 프로토타입기반으로객체지향적으로설계하는것이복잡하여클래스라
는 sugar syntax 문법이도입된것이다. 그렇기 때문에이에따른제약사
항이많다. 편한만큼고려해야할사항도많은것이다. 하나씩살펴보자.
3.
클래스는선언문또는표현식으로선언할수있다.
//클래스 선언문으로 클래스선언
class name {
//...
}
//클래스 표현식으로 클래스 선언
let name = class {
//...
}
let name = class inner_name {
//...
}
console.log(typeof name); //function
new 키워드가 실행되는메커니즘은다음과같다.
1. constructor는우선적으로빈(empty) 오브젝트(인스턴스)를생성한다.
2. 넘겨받은파라미터를생성한빈오브젝트의프로퍼티에설정한다.
3. 인스턴스를먼저생성하므로, constructor 내부에서는this keyword를
통해인스턴스자신을가리킬수있다.
4. constructor에별도의return이설정되어있지않으면new를실행한곳
으로해당클래스의인스턴스를반환한다.
cf) constructor는 별도의 return을 설정할 수 있다. 하지만 Number,
String 값이 return value로 지정되어 있으면 이를 무시하고 인스턴스 자신
을 return 한다.
슈퍼클래스의메소드를오버라이딩(Overriding) 할수있다.
class Foo{
getName() {
console.log("Foo");
}
}
class Bar extends Foo {
// override
getName() {
console.log("Bar");
}
}
let bar = new Bar();
bar.getName(); //Bar
class Foo {
staticgetName() {
console.log("Foo");
}
}
Foo.getName(); //Foo
let foo = new Foo();
foo.getName();//not a function
정적메소드는 prototype 에추가되지않는다.
23.
class Foo {
staticgetName() {
console.log("Foo");
}
getAlias() {
console.log("foo");
}
}
console.log(Foo.prototype.getName === Foo.getName);//false
console.log(Foo.prototype.getAlias === new Foo().getAlias);
class Foo {
constructor(){
console.log(new.target);//[Function: Bar]
console.log(typeof new.target);//function
console.log("Foo: ", new.target.getName());//Foo: bar
}
}
class Bar extends Foo {
constructor() {
super();
}
static getName() {
return "bar";
}
}
let bar = new Bar();