class可用于数据存储和呼应,可以将页面数据分离出来,提取到一个类中。也可以将函数抽取出来,实例化成类进行调用。ts中的class类与js中的class类基本相同。区别在于ts中的类有数据类型约束。使用类时,必须遵循定义的数据类型约束。类中有构造函数,可以改变类Value的属性,在实例化类传递值时,传入的值也必须符合构造函数参数的数据类型规范。classclassStudent{//定义属性name:string=''age:number=0gender:string=''//定义构造函数:为了以后实例化对象,可以直接初始化属性构造函数的值(name:string,age:number,gender:string){this.name=namethis.age=agethis.gender=gender}}这里定义的属性是实例对象类本身的属性,不是在对象原型上定义的,可以在实例化类的时候直接获取类的属性,例如:letstudent=newStudent,值为:student.name,此时的值必须为空,因为name没有赋值,但是引用了默认值。赋值操作let{name,age,gender}={name:'张三',age:18,gender:"男"}letstudent=newStudent(name,age,gender)console.log(student)//打印name:'张三',age:18,gender:"Male"这里newStudent是实例化类,将值传入类中进行赋值操作。赋值操作在构造函数中完成,通过new关键字实例化对象,会自动调用构造函数构造函数。ts构造函数在接收参数时,需要定义参数的数据类型。这里传入的是姓名、年龄、性别。那么在接收参数的时候就必须定义这三个值。并且指定的数据类型必须一致。this.name=name是class的实例属性=传入的name参数,这一步就是赋值操作。assignment后,可以拿到letstudent位置的数据。直接newclass,如果不传值或者传空值,会使用类中的默认值,相当于重新设置类的值;如果new传入一个值,则以传入的值为准。使用calss需要注意的地方1.class的instance属性需要有一个默认值。如果没有初始化赋值,就会报错。classPersonTest0{//没有默认值,会报错。{//这里进行了判断,不是直接赋值,也会报错。去掉if直接this.name=info.name不会报错if(info){this.name=info.name}}}//定义了构造函数但是没有赋值初始化,报错。classtest2{name:stringconstructor(name:string){//没有this.name=name,报错}}2.类中定义的属性不需要全部传入,也可以传入一部分通过。没有传入的用默认值或者undefined显示(ts需要定义传入类型,没有传入的用?可选符号声明)。interfaceIPersonTest{name:stringage:numberaddress?:string}classPersonTest{name:string=''age:number=0address?:string=''constructor(info:IPersonTest|null){if(info){这个.name=info.namethis.age=info.agethis.address=info.address}}}letPInfo={name:'zs',age:10,//address:'Hubei'}letgetPerson=newPersonTest(PInfo)//传入构造函数值并为实例属性赋值//打印zs,10,undefined3,传入顺序不影响给类赋值letPInfo={name:'zs',age:10,address:'湖北'}letPInfo2={name:'东方无敌',age:10,address:'湖南'}letgetPerson=newPersonTest(PInfo)//传入构造函数值并赋值到实例属性console.log(getPerson);console.log(newPersonTest(null));//如果构造函数的值为空,则初始化实例属性的值console.log(newPersonTest(PInfo2));//传入顺序不影响类Assignment,这里传入PInfo2,获取PInfo2的值console.log(newPersonTest(PInfo));//传入的顺序不影响对类的赋值,这里传入的是PInfo,得到的结果是PInfo的值类中定义的方法classStudent{name:stringage:numbergender:stringconstructor(name:string,age:number,gender:string){this.name=namethis.age=agethis.gender=gender}//定义实例方法sayHi(say:string){console.log(`${say}你好,我叫${this.name},今年${this.age}岁,我是${this.gender}孩子`);}}let{name,age,gender}={name:'张三',age:18,gender:"男"}letstudent=newStudent(name,age,gender)console.log(student.sayHi('你What'syourname?')));//打印what'syourname?大家好,我叫张三,今年18岁。我是一个男孩。这里,在类内部定义了一个方法。定义方法同普通写函数。有参数,可以设置默认参数。必须定义参数。数据类型,如果获取类的实例方法的值,可以使用this.xxx获取类中的属性值。类的方法可以直接使用实例对象。方法名称(student.sayHi())。sayHi()方法实际上是直接在Student.prototype上定义的,所以在类的实例上调用方法实际上是在原型上调用方法。默认值类的属性和方法可以有默认值。如果实例化的类没有传入参数使用默认值//打印属性的默认值classcla2{name:stringconstructor(name:string='东方无敌'){this.name=name}}letdata=newcla2()//赋值之后的构造函数的名字this.nameconsole.log(data.name)的新分类;//打印EasternUnbeatenclasscla3{name:stringconstructor(name:string='Unbeaten'){this.name=name}sayHi(say:string='Eastern'){console.log(`${say},${this.name}`);}}letdata=newcla3()//newcla3后,函数获取name的值加上函数的默认值console.log(data.sayHi());//打印东方,无敌静态方法classopenInfo{fun(list){//实例方法console.log(list)}staticfun2(list){//静态方法console.log(list)}}letlist1=50newopenInfo().fun(list1)//print50//类实例属性需要new,语法:classname().methodname()letlist2=100openInfo.fun2(list2)//print100//class静态方法不需要new,语法:类名。method()类相当于实例的原型,类中定义的所有方法都不会被实例继承如果在方法前加上static关键字,则表示该方法不会被实例继承,而是直接通过类调用,称为静态方法。静态属性通常,一个类的属性值有两种,第一种是实例属性,第二种是静态属性。这与类中的函数处于同一级别。这个方法定义了实例对象本身的属性,而构造函数中定义的this.xxx是实例对象的prototype属性。该类不需要传入所有定义的属性,或部分传入。未引入的显示默认值或undefined(ts需要定义传入类型,未引入的用?可选符号声明)。这两种方法没有本质区别,实例属性可以有默认值。第二种:静态属性&静态方法。在实例属性或实例方法前加一个static,就是静态属性。静态属性不需要new。取值方法:类名。属性名是需要新建的实例属性。例如,newPerson()或newPerson()。方法name()或newPerson()。属性名静态属性直接就是类名。属性名称,例如:Person。方法名称()或人。attributenameclassPersonStatic{//name是静态属性中的关键字,不允许//staticnames:string//这里没有赋值是一个undefinedstaticnames:string=''staticage:number=0staticaddress:string=''staticobj:any={user:'pumpkinporridge',money:5}staticsayHi(){}//静态方法}console.log(newPersonStatic);//打印PersonStatic类console.log(PersonStatic.names,PersonStatic.age,PersonStatic.address);//获取初始化值,为空则不显示console.log(PersonStatic.names='东方秋白',PersonStatic.age=10,PersonStatic.address='湖北');//静态改变属性值console.log(PersonStatic.names='IntroductiontoArt');//改变静态属性值console.log(PersonStatic.obj={user:'紫薯粥',money:6});//更改对象值//console.log(PersonStatic=100);//错误打印结果:静态属性可以直接改变,改变值的顺序不影响它的输出。与实例属性不同的是,实例属性定义了实例对象本身的属性,在类体上。构造函数可以改变实例属性的值,而静态属性和方法直接定义在构造函数constructor中,所以可以直接改变值。而这也解释了为什么在静态属性中不能使用name,因为name是被类本身占用的。不同的是类实例属性可以通过构造函数传入的值批量改变。静态属性必须有一个类名。属性名称更改接口1.接口可以约束类内部值的数据类型和方法。类使用接口后,接口定义的数据类型和方法都必须真正实现,并基于实现,类可以有自己的属性和方法。接口中可以定义属性和方法,这里以方法为例。//interfaceinterfaceIFly{fly():string//方法返回字符串类型}classPersonimplementsIFly{fly():string{//实现接口中的方法,没有fly()的类会报错return'Icanfly'}run():string{//calss自己定义的方法return'Iwillrun'}}Person类中必须有IFly定义的fly(),该方法必须有字符串返回值,否则会报错。2.一个class类可以实现一个接口,也可以实现多个接口,接口中的内容必须真正实现//IMy继承了上面定义的两个接口interfaceIRun{run():string//该方法返回一个字符串类型}interfaceIFly{fly():string//方法返回字符串类型}//一个类可以实现一个接口或多个接口,接口中的内容必须实际实现classPerson2implementsIFly,IRun{fly():string{return'Icanfly'}run():string{return'Icanrun'}}letperson2=newPerson2()console.log(person2.fly(),person2.run());接口可以继承,类可以使用继承的接口,或者多个接口,方法是一样的,关于接口继承请看另一篇文章:【TS】接口和接口继承案例源码:https://gitee.com/wang_fan_w/ts-seminar如果您觉得本文对您有帮助,请点亮star
