TypeScript初试(四)

其实之前写js的时候,很少使用继承、原型这种东东。但是在开发游戏的时候,发现这个得到了大量的使用。特别是最开始不会的时候,后端童鞋不厌其烦的给我讲private、public、static等等,先感谢一下公司后端童鞋的技术支持,哈哈。
其实es6中,已经有了class,但是平常的项目中还是用的较早版本的js。而在ts的使用中,class作为原生支持的写法,使得我们能够更好的开发。

start

类 class

如果之前接触过java的童鞋肯定会更觉得,下面的代码跟java非常的相像。

class Person {
    private name: string;

    public constructor(name: string) {
        this.name = name;
    }

    public speakName() {
        return 'My name is' + this.name;
    }
}

var zhangshuang: Person = new Person('zhangshuang');

我们声明了一个类’Person’,这个类里面有三个成员分别是私有变量’name’,构造函数’constructor’,方法’speakName’;
先不用管private跟public,当我们发现this的时候,就可以说明这个变量或者方法是属于’Person’这个类的。
最后一行,通过’new’关键字,我们构造了一个’Person’类的实例。

修饰符 private public
private 私有

我们法相上面的例子中,声明变量’name’时,我们使用了private这个关键字。
当我们使用’private’声明变量时,该变量只能在类的内部使用,也就是这个变量是这个类的私有成员,外部或者实例化时不可以调用。

public 公有

在上面的例子中,我们使用’public’关键字写了一个方法。通过’public’修饰的成员是公有的,可以通过外部或者实例化来调用。如果我们不用’public’修饰的话,变量或者方法默认就是’public'(公有)的。

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

我们不能在’Person’类外使用name,但是可以在继承自’Person’类的’Employee’类中使用。

静态属性 static

在使用类或者其内部的方法时,我们一般都会实例化一个,然后再调用方法。但是当我们把一个变量或者方法的属性设置为static时,就可省去实例化的步骤,直接调用。

class Person {
    public static name: string = 'person';
}
单例模式

在游戏开发中,有些类如场景等,我们是不希望出现多个的,所以这里使用单例模式开发会避免重复实例化同一个类出现的问题。

class MainView {

    private static instance: MainView;

    public static getInstance() : MainView {
        if(MainView.instance == null) {
            MainView.instance = new MainView();
        }
        ruturn MainView.instance;
    }
}

这里就是通过判断instance这个属性是否为null,如果是null则实例化一个类,如果不为null则直接ruturn instance

继承 extends
class Person {
    private name: string;

    public constructor(name: string) {
        this.name = name;
    }

    public speakName() {
        return 'My name is' + this.name;
    }
}

class Student extends Person {
    public constructor() {
        super();
    }

    public grade: number;
}

上面的例子中,我们先声明了一个类Person,然后又声明了一个类Student继承自Person类。
构造函数中的super()标示,这个类继承了原型中的所有的方法和属性。