→ 비공개로 설정하려는 속성은 private로 설정하고, 속성값을 읽고 수정하는 getter & setter 함수를 사용.
class Person {
private._name: string;
get name() { // getter
return this._name;
}
// name의 글자가 10자 이상인 경우 에러를 발생시키는 코드
set name(name: string) { // setter
if(name.length > 10) {
throw new Error("name too long")
}
this._name = name;
}
}
let person = new Person();
console.log(person.name); // undefined
person.name = "june";
console.log(persone.name); // june
person.name = "junejunejunejunejune"; // Error, name이 10자 이상이기 때문에 에러가 발생함.
→ 읽기만 가능한 속성을 선언하기 위해 사용.
속성을 읽기 전용으로 설정해 변경할 수 없게 만들기 위해 사용.
선언될 때와 생성자에서 값을 설정하면 이후에 수정할 수 없음.
class Person {
**readonly** age: number = 20; // 선언 초기화
constructor(age: number) {
this.age = age;
}
}
let person = new Person(10); // 생성자 초기화
person.age = 30; // Error, 인스턴스화 된 이후에 값을 변경했기 때문에 에러가 발생함.
→ 전역 멤버를 선언할 때 사용.
전역 멤버 → 객체마다 할당되지 않고 클래스의 모든 객체가 공유하는 멤버.
각 인스턴스가 아닌 클래스 자체에서 보이는 전역 멤버를 생성함.
그래서 범용적으로 사용되는 값에 설정함.
클래스명.
을 앞에 붙여 static 멤버에 접근할 수 있음.
ES6에서는 메소드 전용 속성엔 선언되지 않았으나, 타입스크립트에선 사용할 수 있음.
class Grid {
static orign = { x: 0, y: 0 };
calculateDistanceFormOrigin(point: { x: number; y: number }) {
let xDist = point.x - Grid.origin.x;
let yDist = point.y - Grid.origin.y;
return Math.sqrt(xDist * xDist + yDist * yDist) / this.slace;
}
constructor(public scale: number) {}
}
let grid1 = new Grid(1.0); // 1x scale
let grid2 = new Grid(5.0); // 5x scale
console.log(grid1.calculateDistanceFormOrigin({ x: 10, y: 10}));
console.log(grid2.calculateDistanceFormOrigin({ x: 10, y: 10}));
Grid
안에 origin
이 static으로 선언되어 있기 때문에 origin
필드에 클래스명.
을 붙여 접근이 가능함. 뿐만 아니라 클래스 밖에서 Grid.origin
을 선언하여 접근 및 할당도 가능함.