class MyClass {
name = "MyClass";
getName() {
return this.name;
}
}
const c = new MyClass();
const obj = {
name: "obj",
getName: c.getName,
};
// Prints "obj", not "MyClass"
console.log(obj.getName());
-
class MyClass {
name = "MyClass";
getName(this: MyClass) {
return this.name;
}
}
const c = new MyClass();
// OK
c.getName();
// Error, would crash
const g = c.getName;
console.log(g());
class Department {
name: string;
constructor(n: string) {
this.name = n;
}
describe(this: Department) {
console.log('Department: ' + this.name);
}
}
const accounting = new Department('Accounting');
const accountingCopy = { name: 'DUMMY', describe: accounting.describe };
//OK
accountingCopy.describe();
class Box {
contents: string = "";
set(value: string) {
this.contents = value;
return this;
}
}
class ClearableBox extends Box {
clear() {
this.contents = "";
}
}
const a = new ClearableBox();
const b = a.set("hello");
class Box {
content: string = '';
sameAs(other: this) {
return other.content === this.content;
}
}
class ClearableBox extends Box {
otherContent: string = '?';
}
const box = new Box();
const clearBox = new ClearableBox();
// Error
console.log(clearBox.sameAs(box));
참고링크 : TypeScript Handook - this
public
으로 선언된 member는 어디서든 접근 가능함class Department {
name: string;
constructor(n: string) {
this.name = n;
}
describe(this: Department) {
console.log('Department: ' + this.name);
}
}
const accounting = new Department('Accounting');
//OK
accounting.name = 'Max';
public
이므로, 외부에서 접근 가능함class Greeter {
public greet() {
console.log("hi!");
}
}
const g = new Greeter();
g.greet();
public
이므로, 외부에서 호출 가능함protected
로 선언한 member는 선언한 클래스와 그 하위 클래스에서만 접근 가능함class Greeter {
public greet() {
console.log("Hello, " + this.getName());
}
protected getName() {
return "hi";
}
}
class SpecialGreeter extends Greeter {
public howdy() {
// OK to access protected member here
console.log("Howdy, " + this.getName());
}
}
const g = new SpecialGreeter();
g.greet(); // 'Hello, hi'
g.howdy(); // 'Howdy, hi'
g.getName(); //Error
protected
로 선언된 getName 메소드은 하위 클래스인 SpecialGreeter의 howdy 메소드 내에서 접근 가능하지만, 외부에서 접근할 수 었음class Base {
protected x: number = 1;
}
class Derived1 extends Base {
protected x: number = 5;
}
class Derived2 extends Base {
f1(other: Derived2) {
other.x = 10;
}
f2(other: Base) {
other.x = 10; //Error
protected
로 선언한 x는 Derived1의 하위 클래스에서만 접근 가능함private
으로 선언한 member는 선언한 클래스에서만 접근 가능함class Department {
name: string;
private employees: string[] = [];
constructor(n: string) {
this.name = n;
}
describe(this: Department) {
console.log('Department: ' + this.name);
}
addEmployee(employee: string) {
this.employees.push(employee);
}
printEmployeeInfo() {
console.log(this.employees.length);
console.log(this.employees);
}
}
const accounting = new Department('Accounting');
accounting.addEmployee('Max');
accounting.addEmployee('Maru');
accounting.printEmployeeInfo(); // 2
accounting.employees[2] = 'Marry' // Error
private
으로 선언한 employees는 선언한 클래스의 메소드를 통해서만 조작 가능함class Base {
private x = 0;
}
const b = new Base();
// Can't access from outside the class
console.log(b.x);
class Derived extends Base {
showX() {
// Can't access in subclasses
console.log(this.x);
Property 'x' is private and only accessible within class 'Base'.
}
}
private
으로 선언한 memeber는 하위 클래스에서도 접근 불가능함class A {
private x = 10;
public sameAs(other: A) {
// No error
return other.x === this.x;
}
}
private
으로 선언된 member에 접근 가능함private
로 선언된 member는 타입을 확인할 때 []를 사용하여 접근 가능함class MySafe {
private secretKey = 12345;
}
const s = new MySafe();
// Not allowed during type checking
console.log(s.secretKey);
// OK
console.log(s["secretKey"]);
readonly
를 선언한 member는 재할당이 불가능함class Department {
constructor(private readonly id: string, public name: string) {}
describe(this: Department) {
// Error
this.id = d2;
console.log(`Department ${this.id}: ` + this.name);
}
}
const accounting = new Department('id1', 'Max');
private
와 protected
는 타입을 확인할 때 실행됨private
이나 protected
로 선언된 member에 접근 가능함class MySafe {
private secretKey = 12345;
}
Try
// In a JavaScript file...
const s = new MySafe();
// Will print 12345
console.log(s.secretKey);
#
)는 컴파일 이후에도 private
으로 남아 있음class Dog {
#barkAmount = 0;
personality = "happy";
constructor() {}
}
#
의 자리에 WeakMap
을 사용함"use strict";
var _Dog_barkAmount;
class Dog {
constructor() {
_Dog_barkAmount.set(this, 0);
this.personality = "happy";
}
}
_Dog_barkAmount = new WeakMap();
closure
, WeakMap
, private field(#
) 를 사용해야함