其实之前写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()
标示,这个类继承了原型中的所有的方法和属性。