prototype이 아닌 함수 자체에 메서드를 설정할 수 있는데, 이를 정적 메서드라고 한다. (static method)
class User {
constructor() {}
static staticMethod() {
console.log(this);
}
say() {
console.log(this);
}
}
console.log(User.prototype.constructor); // [class User]
console.log(User); // [class User]
User.staticMethod(); // [class User]
let u = new User();
User.prototype.say(); // {}
u.say(); // User {}
즉, 함수를 객체로서 보았을때 프로퍼티를 추가한 것이다.
아래와 같다.
클래스가 함수와 같고, 함수는 객체의 한 종류라는 점을 알고있으니, 이해가 잘 됬다.
class User {}
User.myStatic = function () {
console.log(this);
};
User.myStatic();
팩토리 메서드
흔히 데이터베이스관련 클래스에서 볼 수 있었던 패턴이다.
class DataBase {
constructor(value, date) {
this.value = value;
this.createdAt = date;
}
static create(value) {
return new DataBase(value, new Date());
}
}
let a = DataBase.create("A");
console.log(a); // DataBase { value: 'A', createdAt: 2022-09-03T11:28:44.193Z }
static 메서드와 프로퍼티는 상속이된다.
오버라이딩은 불가능하다.
class DataBase {
static schema = "kongDB";
constructor(value, date) {
this.value = value;
this.createdAt = date;
this.schema = DataBase.schema;
}
static create(value) {
return new DataBase(value, new Date());
}
}
class MySql extends DataBase {
static schema = "sqlDB";
}
console.log(MySql.create("hi"));
/*
DataBase {
value: 'hi',
createdAt: 2022-09-03T11:33:04.698Z,
schema: 'kongDB'
}
*/
언제써야할까?
인스턴스가아닌 클래스 전체에 필요한 기능을 만들때 사용할 수 있다.
반응형
'Archive' 카테고리의 다른 글
try ... catch 와 에러 핸들링 (0) | 2022.09.04 |
---|---|
내장 클래스 확장하기 (0) | 2022.09.03 |
클래스 문법 (0) | 2022.09.03 |
prototype 과 상속 (0) | 2022.09.01 |
함수 바인딩 (0) | 2022.09.01 |