Typescript Class

TypeScript-Class

typescript之旅

1.TypeScript-Basic
2.TypeScript interface
3.Typescript-module(1)
4.TypeScript Modules(2)
5.Typescript tsconfig
6.TypeScript Functions
7.Typescript Classjavascript

Class

class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}

let greeter = new Greeter("world");
  • 對於這個demo的理解怎麼說呢?java

  • 若是你是java或C#程序員,你應該這樣理解:程序員

public class Greeter{
    public String greeting;
    public Greeter(String message){
        this.greeting = message;
    }
    public string greet(){
        return "Hello, " + this.greeting;
    }
}
  • 若是你是javascript程序員,那你應該這樣理解typescript

function Greeter(message){
    this.greeting = message;
}
Greeter.prototype.greet = function(){
    return "Hello, " + this.greeting;
}

參數屬性

  • 對於上個例子,有一種簡寫方法segmentfault

class Animal {
    constructor(private name: string) { }
    move(distanceInMeters: number) {
        console.log(`${this.name} moved ${distanceInMeters}m.`);
    }
}
  • 僅在構造函數裏使用private name: string參數來建立和初始化name成員。 咱們把聲明和賦值合併至一處。函數

  • 參數屬性經過給構造函數參數添加一個訪問限定符來聲明。 使用private限定一個參數屬性會聲明並初始化一個私有成員;對於public和protected來講也是同樣。this

繼承

class Animal {
    name:string;
    constructor(theName: string) { this.name = theName; }
    move(distanceInMeters: number = 0) {
        console.log(`${this.name} moved ${distanceInMeters}m.`);
    }
}

class Snake extends Animal {
    constructor(name: string) { super(name); }
    move(distanceInMeters = 5) {
        console.log("Slithering...");
        super.move(distanceInMeters);
    }
}

class Horse extends Animal {
    constructor(name: string) { super(name); }
    move(distanceInMeters = 45) {
        console.log("Galloping...");
        super.move(distanceInMeters);
    }
}

let sam = new Snake("Sammy the Python");
let tom: Animal = new Horse("Tommy the Palomino");

sam.move();
tom.move(34);
  • 這個代碼的理解呢?java程序員應該很好理解吧,子類重寫了父類方法move,而後父類引用指向子類對象,多態實現了!prototype

  • 重點是javascript如何理解呢?code

本質是javascript的原型繼承,若是你想了解javascript繼承高仿對象

OOP,我這裏有一篇文章javascript繼承

公共,私有與受保護的修飾符

  • 想必是java同窗前面一直有的疑問吧?

首先記住默認共有
第一個例子我但是所有加了public關鍵字的哦

理解private

class Animal {
    private name: string;
    constructor(theName: string) { this.name = theName; }
}

new Animal("Cat").name; // Error: 'name' is private;

理解protected

  • protected修飾符與private修飾符的行爲很類似,但有一點不一樣,protected成員在派生類中仍然能夠訪問。例如:

class Person {
    protected name: string;
    constructor(name: string) { this.name = name; }
}

class Employee extends Person {
    private department: string;

    constructor(name: string, department: string) {
        super(name)
        this.department = department;
    }

    public getElevatorPitch() {
        return `Hello, my name is ${this.name} and I work in ${this.department}.`;
    }
}

let howard = new Employee("Howard", "Sales");
console.log(howard.getElevatorPitch());
console.log(howard.name); // error
  • 構造函數也可被標記爲protected. 這就是說這個類不能在包含它的類以外實例外,可是能夠被繼承。好比,

class Person {
    protected name: string;
    protected constructor(theName: string) { this.name = theName; }
}

// Employee can extend Person
class Employee extends Person {
    private department: string;

    constructor(name: string, department: string) {
        super(name);
        this.department = department;
    }

    public getElevatorPitch() {
        return `Hello, my name is ${this.name} and I work in ${this.department}.`;
    }
}

let howard = new Employee("Howard", "Sales");
let john = new Person("John"); // Error: The 'Person' constructor is protected
  • 想什麼,對抽象類

Get/Set

class Employee {
    private _fullName: string;

    get fullName(): string {
        return this._fullName;
    }

    set fullName(newName: string) {
        if (passcode && passcode == "secret passcode") {
            this._fullName = newName;
        }
        else {
            console.log("Error: Unauthorized update of employee!");
        }
    }
}

let employee = new Employee();
employee.fullName = "Bob Smith";
if (employee.fullName) {
    alert(employee.fullName);
}
  • 和C#很像

靜態屬性

  • 使用很簡單的,屬性前加static關鍵字

class Grid {
    static origin = {x: 0, y: 0};
    calculateDistanceFromOrigin(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.scale;
    }
    constructor (public scale: number) { }
}

let grid1 = new Grid(1.0);  // 1x scale
let grid2 = new Grid(5.0);  // 5x scale

console.log(grid1.calculateDistanceFromOrigin({x: 10, y: 10}));
console.log(grid2.calculateDistanceFromOrigin({x: 10, y: 10}));

console.log(Grid.origin);

抽象類

abstract class Animal {
    abstract makeSound(): void;
    move(): void {
        console.log('roaming the earch...');
    }
}

高級技巧

class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}

var greeter: Greeter;
greeter = new Greeter("world");
alert(greeter.greet());
  • greeter的類型是Greeter, Greeter的類型是typeof Greeter

class Greeter {
    static standardGreeting = "Hello, there";
    greeting: string;
    greet() {
        if (this.greeting) {
            return "Hello, " + this.greeting;
        }
        else {
            return Greeter.standardGreeting;
        }
    }
}

var greeter1: Greeter;
greeter1 = new Greeter();
alert(greeter1.greet());

var greeterMaker: typeof Greeter = Greeter;
greeterMaker.standardGreeting = "Hey there!";
var greeter2:Greeter = new greeterMaker();
alert(greeter2.greet());
  • 這個語法不經常使用,據我所知只在動態加載中有用

  • 抽象方法的語法與接口方法類似:定義方法簽名不包含方法體

  • 區別:抽象類:抽象方法必須使用abstract關鍵字而且能夠包含訪問符

相關文章
相關標籤/搜索