一.类
1.1 声明
类声明引入一个新类型,并定义其字段、方法和构造函数。
定义类后,可以使用关键字new创建实例 可以使用对象字面量创建实例
在以下示例中,定义了Person类,该类具有字段firstname和lastname、构造函数和方法fullName
//创建对象
export class Person{// 属性 必须要有初始值firstName:string=''lastName:string=''//构造函数:给属性初始值,初始化属性(可加可不加)// constructor() {// console.log('无参函数')// }constructor( firstName:string,lastName:string) {this.firstName = firstNamethis.lastName = lastName}fullName(){return this.lastName+this.firstName}
}
class Person2{firstName:string=''lastName:string=''//不能有构造函数和函数,只能有普通属性,赋值用:不用=// constructor( firstName:string,lastName:string) {// this.firstName = firstName// this.lastName = lastName// }//不能有函数// fullName(){// return this.lastName+this.firstName// }
}
//字面量创建对象
let pp:Person2={ firstName: '六', lastName: '王'}
1.2字段
字段是直接在类中声明的某种类型的变量。
类可以具有实例字段或者静态字段。
1.2.1 实例字段
实例字段存在于类的每个例字段实例上。每个实例都有自己的实例字段集合。
要访问实例字段,需要使用类的实例。
let p:Person=new Person('z','s')
//实例字段,通过new对象之后进行访问的字段
p.firstName='几十块';
1.2.2 静态字段
使用关键字static将字段声明为静态。静态字段属于类本身,类的所有实例共享一个静态字段。
要访问静态字段,需要使用类名
xport class Person3{//静态字段static firstName:string=''lastName:string=''
1.3 字段初始化
为了减少运行时的错误和获得更好的执行性能,
ArkTS要求所有字段在声明时或者构造函数中显式初始化。这和标准TS中的strictPropertyInitialization模式一样。
1.4 方法
方法属于类。类可以定义实例方法或者静态方法。静态方法属于类本身,只能访问静态字段。而实例方法既可以访问静态字段,也可以访问实例字段,包括类的私有字段。
1.4.1 静态方法
使用关键字static将方法声明为静态。静态方法属于类本身,只能访问静态字段。
静态方法定义了类作为一个整体的公共行为。
必须通过类名调用静态方法
//静态函数static a(){Person3.firstName='张三'//不支持this,无法直接访问非静态字段和函数// this,lastName='aa'}
}
1.5 继承
一个类可以继承另一个类(称为基类),并使用以下语法实现多个接口
继承类继承基类的字段和方法,但不继承构造函数。继承类可以新增定义字段和方法,也可以覆盖其基类定义的方法。
基类也称为“父类”或“超类”。继承类也称为“派生类”或“子类”。
1.5.1 父类访问
关键字super可用于访问父类的实例字段、实例方法和构造函数。在实现子类功能时,可以通过该关键字从父类中获取所需接口
//宠物 父类,基类,超类
class Pet{name:string=''sex:string=''static age:number=0constructor(name:string,sex:string) {this.name=namethis.sex=sex}show(){return`昵称:${this.name},性别:${this.sex}`}
}
//子类 只支持单继承
class DOg extends Pet{//必须调用父类的有参的构造函数,不能继承constructor(name:string,sex:string) {//super 调用父类的构造函数super(name,sex)}
1.6 方法重写与重载
子类可以重写其父类中定义的方法的实现。重写的方法必须具有与原始方法相同的参数类型和相同或派生的返回类型。
通过重载签名,指定方法的不同调用。具体方法为,为同一个方法写入多个同名但签名不同的方法头,方法实现紧随其后,如果两个重载签名的名称和参数列表均相同,则为错误
type:string=''//重写:子类重写父类的函数//要求:1.方法名相同2.参数类型相同3.返回值类型相同或是其子类show(){return super.show()+'品种'+this.type}//默认调用子类a(){this.show()//子类super.show()//父类}//方法的重载:1.同一类中,方法名相同,参数列表不同,返回值类型相同//arkts不支持重载// shows(a:number){//// }// shows(a:number){//// }
class Over{//重载// aa(x:number):void// aa(x:string):voidaa(x:number|string):void{}
}
1.7构造函数
类声明可以包含用于初始化对象状态的构造函数
如果未定义构造函数,则会自动创建具有空参数列表的默认构造函数
在这种情况下,默认构造函数使用字段类型的默认值来初始化实例中的字段
class Pri{private _a1: stringpublic set a1(value: string) {this._a1 = value}public get a1(): string {return this._a1}private _a2: stringpublic set a2(value: string) {this._a2 = value}public geta2(): string {return this._a2}constructor(a1: string, a2: string) {this._a1 = a1this._a2 = a2}}let p1=new Pri('1','2');
p1.a1='a'
1. 8可见性修饰符
public(公有)
public修饰的类成员(字段、方法、构造函数)在程序的任何可访问该类的地方都是可见的。
private(私有)
private修饰的成员不能在声明该成员的类之外访问
protected(受保护)
protected修饰符的作用与private修饰符非常相似,不同点是protected修饰的成员允许在派生类中访问
class Aa{//共有的public a1:string=''//受保护的:本类和子类中使用protected a2:string=''//私有的private a3:string=''
}
class Bb extends Aa{show(){this.a2='asd'}}
let aa=new Aa();
let bb=new Bb()
getter和setter
setter和getter可用于提供对对象属性的受控访问
1.9 对象字面量
对象字面量是一个表达式,可用于创建类实例并提供一些初始值.他在某些情况下更方便,可以用来代替new表达式
对象字面量的表达方式是:封闭在花括号对({})中的'属性名:值'的列表
class C{
n:number=0
s;string=''
}let c:C={n:42,S:'foo'}
对象字面量只能在推导出该字面量类型的上下文中使用
也可以在数组元素类型或字段类型中使用
1.10Record类型的对象字面量
泛型Record<K, V>用于将类型(键类型)的属性映射到另一个类型(值类型)。常用对象字面量来初始化该类型的值
类型K可以是字符串类型或数值类型,而V可以是任何类型
二.接口
2.1接口
接口声明引入新类型。接口是定义代码协定的常见方式。
任何一个类的实例只要实现了特定接口,就可以通过该接口实现多态。
接口通常包含属性和方法的声明
//接口
interface Stus{//接口中的方法,没有方法体(方法的实现)eat():voidstudy():number
}
//(实现类)实现接口,必须重写接口中的方法
class Stu1 implements Stus{eat(): void {console.log('学生在吃')}study(): number {console.log('学生在学习')return 100}}
2.2接口属性
接口属性可以是字段、getter、setter或getter和setter组合的形式。
属性字段只是getter/setter对的便捷写法
实现接口的类也可以使用以下两种方式