class Department {
name:string;
constructor(n: string) {
this.name = n;
}
}
const CMS = new Department('SoftWare');
var Department = (function () {
function Department(n) {
this.name = n;
}
return Department;
}());
var CMS = new Department('SoftWare');
class Department {
name:string;
constructor(n: string) {
this.name = n;
}
describe() {
console.log('Department : ' + this.name);
}
}
const CMS = new Department('SoftWare');
CMS.describe();
const CMScopy = {describe: CMS.describe}
CMScopy.describe();
왜일까? => 자세히 보면 CMScopy에 describe는 CMS.describe를 실행하는 것이 아닌 pointing하고 있다.
그래서 CMS.describe 메서드에 적혀있는 this
가 더이상 원본 객체인 CMS를 pointing하고 있지 않다. 여기서 pointing하는 것은 CMScopy가 된다는 것이다.
그렇다면 이러한 헷갈림을 방지하고싶다면 어떻게 하면 될까?
=> class에 this 값이 들어가는 메서드가 있다면 this 값의 type을 지정해주면 된다.
class Department {
name:string;
constructor(n: string) {
this.name = n;
}
describe(this:Department) {
console.log('Department : ' + this.name);
}
}
const CMS = new Department('SoftWare');
const CMScopy = { name:'헬창 개발자', describe: CMS.describe}
CMS.describe();
CMScopy.describe();
class Department {
constructor(n) {
this.employees = [];
this.name = n;
}
describe() {
console.log('Department : ' + this.name);
}
addEmp(emp) {
this.employees.push(emp);
}
printEmpInfo() {
console.log(this.employees.length);
console.log(this.employees);
}
}
const cms = new Department('SoftWare');
더욱 자세한 정보는 Mozilla에서 확인하면 된다.
따라서 TS는 런타임이 아닌 컴파일 과정에서 이를 검토하고 확인한다.
class Department {
constructor(private id:string, private name:string) {}
describe(this: Department) {
console.log(`Department ${this.id}: ${this.name}`);
}
}
const cms = new Department('d1', 'SoftWare');
cms.describe();
class Department {
constructor(private readonly id:string, private name:string) {}
...
https://developer.mozilla.org/ko/docs/Web/JavaScript/Inheritance_and_the_prototype_chain
class Department {
constructor(private readonly id:string, private name:string) {}
describe(this: Department) {
console.log(`Department ${this.id}: ${this.name}`);
}
}
class ITDepartment extends Department{
constructor(id:string, public admins:string[]) {
super(id, 'IT');
}
}
const cms = new ITDepartment('d1', ['정우']);
cms.describe();
이제 getter와 setter로 캡슐화를 해보겠다.
getter 메서드는 this.해당field
값을 반환해줘야한다.
setter를 설정할 때 getter와 같은 네이밍으로 선언가능하다 다만, 반드시 매개변수가 있어야한다.
이떄 getter, setter 모두다 메서드이지만 메서드로 접근하지 않고 모두 속성값처럼 접근해야한다.
abstract class Class이름{
constructor(private 속성1:타입, private readonly 속성2:타입, ...){}
abstract 메서드1(this:Class이름): 반환타입;
}
정적인 클래스 즉, 개발자가 동적으로 만들지 않고 미리 만들어진 클래스를 뜻한다 대표적으로 Math 클래스가 있다.
그리고 만약 우리가 만든 커스텀 class에서 static하게 속성이나 메서드를 만든다면 이는 인스턴스화를 하지 않고도 사용할 수 있다.
그리고 당연히 인스턴스화를 한 후 사용되는 this 키워드가 들어가있는 생성자 함수에는 static 속성값은 들어갈 수 없다.
이는 인스턴스화를 오직 한 번 할 수 있는 방법이다.
이는 static을 사용할 수 없거나 사용하고 싶지 않을 때 사용하는 방식이다.
이렇게 하면 new
키워드를 사용할 수 없게 된다. => 어떻게 인스턴스화를 할까? => static 메서드이다.