基本用法
class Animal{public name:string;public constructor(theName:string){this.name = theName;}protected move(distance:number){console.log(`${this.name} 移动了 ${distance}米`)}}
配置项strictPropertyInitialization:false可以不严格设定初始值
类的注解
super在constructor外相当于父类本身
super在constructor内相当于父类的constructor
class Dog extends Animal{public name:string;public constructor(theName2:string){super(theName2)//super相当于构造函数本身,这里会把对应的构造参数传给父类,继承对应的属性}protected move(distance:number=5 ){super.move(distance)//相当于Dog继承父类的move方法,会把对应的数据传过去}}let dog = new Dog('my name is dog')dog.move()
这样dog的prototype上也有move方法,当class Dog extends Animal去掉protected move时,Dog的原型没有次方法,Dog的原型的原型Animal有move方法
类修饰符
public1.自身调用2.子类调用3.实例调用protected1.自身调用2.子类调用private1.自身调用static静态属性只能通过调用class类来调用方法,无法创建实体类
readonly
不能出现在方法前,只能出现在属性前
class Animal{public readonly name:string;public constructor(theName:string){this.name = theName;}}let a = new Animal('dongwu')a.name = 'change'//报错不能改写
简写
class Animal{constructor(private name:string){}}相当于class Animal{private name:string;constructor(name:string){this.name = name;}}
存取器
getter setter
通过函数改变读取赋值行为
class Employee{private _fullName:string = 'node.js';get name(){return 'my name is' + this._fullName;}set name(newName:string){if(passcode){this._fullName = newName;}else{return 'unauthorized'}}}let e = new Employee()console.log(e.name) // my name is node.js
静态属性
非静态属性
所有没有加static的成员都是非静态成员,而类被实例化后,可以通过实例化的类名进行访问.非静态成员的生存期决定于该类的生存期,而静态成员不存在生产期的问题,因为它始终驻留在内存
class Grid{static origin = {x:1,y:2}move(){let x = Grid.origin.x 静态方法使用Grid.origin调用return x}}
抽象类
- 能够提供其他类的基类
- 无法创建实例
- 抽象方法一定要有实现
``javascript abstract class Person{ constructor(public name:string){} say(){ console.log(i can say my${this.name}`) } abstract sayLanguage():void; //声明了抽象方法,子类必须声明此方法 }
class Blackman extends Person{ constructor(){ super(‘blackmanName’) } sayLanguage(){ //声明父类要求的抽象方法 console.log(‘say …’) } fight(){ console.log(‘fight’) } }
let zhijiage:Person; zhijiage = new Person(‘zhi’);//报错,抽象类不能实例化 zhijiage = new Blackman(‘zhi’); zhijiage.sayLanguage(); zhijiage.fight();//报错,因为不符合抽象类,去掉21行即不报错
<a name="yiVKt"></a>### 高阶1. 定义类时,定义了一个类型1. 定义类时,定义了一个构造函数1. 接口可以继承```javascriptclass Greeter{x:number;}let g:typeof Greeter = Greeter;typeof Greeter为构造函数类型g为一个类
可以把类当作接口使用
interface I extends Greeter{y:number;}let a:I = {x:1,y:2};
