Class
의 constructor
는 기존의 생성자 함수와 달리 함수로서는 동작하지 않으며 오직 생성자로서만 존재할 수 있다 → new
를 써야 호출된다
function ES5(name) {
this.name = name;
return name + ' es5';
}
class ES6 {
constructor(name) {
this.name = name;
return name + ' es6';
}
}
console.log(ES5('ES5')); // ES5 es5
console.log(ES5.prototype.constructor('ES5')); // ES5 es5
console.log(ES6('ES6')); // Uncaught TypeError
console.log(new ES6('ES6')); // ES6 { name: "ES6" }
console.log(new ES6.prototype.constructor('ES6')); // ES6 { name: "ES6" }
const es6 = new ES6('ES6');
console.log(new es6.constructor('ES6 awesome')); // ES6 { name: "ES6 awesome" }
Class 에서는 별개의 메서드가 생성자 함수로 활용 될 수 없다
var methodObj = new ES5Parent.prototype.method();
var staticObj = new ES5Parent.staticMethod();
console.log(staticObj); // P…t.staticMethod {s: 11}
console.log(methodObj); // P…t.method {m: 12}
var methodObj = new ES6Parent.prototype.method();
var staticObj = new ES6Parent.staticMethod();
console.log(staticObj); // Uncaught TypeError
console.log(methodObj); // Uncaught TypeError
프로토 타입
상속 하에서는 자식클래스의 생성자함수가 부모클래스의 생성자 함수의 내용을 덮어씌우는 식으로 동작하므로, 기본적으로 부모클래스의 생성자함수를 자식클래스의 생성자함수에서 호출한 것 같은 효과를 얻을 수 없습니다.function Parent() { }
Parent.staticMethod = function() {
this.s = 11;
return 'static method';
}
Parent.prototype.method = function() {
this.m = 12;
return 'method';
}
function Child() { }
Child.prototype = new Parent();
Child.prototype.constructor = Child;
var obj = new Child();
class Parent {
static staticMethod() {
this.s = 11;
return 'static method';
}
method() {
this.m = 12;
return 'method';
}
}
class Child extends Parent { }
const obj = new Child();
// 기본 메소드 상속은 동일
console.log(obj.method()); // 'method'
console.log(Child.prototype.method()); // 'method'
console.log(Parent.prototype.method()); // 'method'
// static method 상속은 다르다
// ES5 // static method가 인스턴스에 없기때문에 prototype에도 없고 자식에게 안간다
console.log(obj.staticMethod()); // Uncaught TypeError
console.log(Child.staticMethod()); // Uncaught TypeError
console.log(Parent.staticMethod()); // 'static'
// ES6 // static method도 자식 클래스 까지는 간다
console.log(obj.staticMethod()); // Uncaught TypeError
console.log(Child.staticMethod()); // 'static'
console.log(Parent.staticMethod()); // 'static'