类
//使用class关键字来定义一个类/*** 对象中主要包含了两个部分* 属性* 方法**/class Person {/*** 直接定义的属性是实例属性,需要通过对象的实例去访问* const per = new Person()* per.name* 使用static开头的属性是静态属性(类属性)可以直接通过类去访问* Person.age*///定义实例属性name: string = 'zz'//在属性前使用static关键字可以定义类属性(静态属性)static age: number = 18//readonly开头的属性表示一个只读的属性无法修改readonly gender: string = '男'//静态只读属性static readonly hobby: string = 'bick'//定义方法/*** 如果方法以static开头则方法就是类方法,可以直接通过类去调用*/static sayHallo() {console.log('hallo')}}const per = new Person()console.log(per.name)console.log(Person.age)Person.sayHallo()
构造函数和this
class Dog{nameage//构造函数,会在对象创建时调用constructor(name:string,age:number){//在实例方法中,this就表示当前的实例//在构造函数中当前对象就是当前新建的那个对象//可以通过this向新建的对象中添加属性this.name = name,this.age = ageconsole.log('构造函数')}bark(){//在方法中可以通过this来表示当前调用方法的对象console.log(this)console.log('wangwangwang!')}}const dog = new Dog('小黑',3)const dog2 = new Dog('小白',4)console.log(dog)console.log(dog2)
继承(extends)
"use strict";(function () {class Animal {constructor(name, age) {this.name = name;this.age = age;}say() {console.log('动物叫!');}}/*** Dog extends Animal* 此时Animal被称为父类,Dog被称为子类* 使用继承后,子类将会拥有父类所有的方法和属性* 通过继承可以将多个类中共有的代码写在一个父类中* 这样只需要写一次即可让所有的子类都同时拥有父类中的属性和方法* 如果希望在子类中添加一些父类中没有的属性或方法直接加就行* 如果在子类中添加了和父类相同的方法,则子类方法会覆盖掉父类的方法* 这种子类覆盖掉父类方法的形式我们称之为 重写*///定义一个类//使Dog类继承 Animal类class Dog extends Animal {run(){console.log(`${this.name}在跑`)}say(){console.log('汪')}}//定义一个类class Cat extends Animal {say(){console.log('喵')}}const dog = new Dog('旺财', 3);const cat = new Cat('咪咪', 9);console.log(dog)console.log(cat);dog.say()cat.say()dog.run()})()
super
(function(){class Animal{name:stringconstructor(name:string){this.name = name}say(){console.log('动物叫!')}}class Dog extends Animal{age:numberconstructor(name:string,age:number){//如果在子类中写了构造函数,在子类的构造函数中必须要对父类的够赞函数进行调用super(name) //调用父类的构造函数this.age=age}say(){//在类的方法中super就表示当前类的父类super.say()console.log('999')}}const dog = new Dog('旺财',3)dog.say()})()
抽象类(sbstract)
以abstract开头的类是一个抽象类
抽象类和其他类区别不大,只是不能用来创建对象
抽象类就是专门被用来继承的类
抽象类中可以添加抽象方法
抽象方法使用abstract开头,没有方法体
抽象方法只能定义在抽象类,子类必须对抽象方法进行重写
(function(){/*** 以abstract开头的类是一个抽象类* 抽象类和其他类区别不大,只是不能用来创建对象* 抽象类就是专门被用来继承的类** 抽象类中可以添加抽象方法*/abstract class Animal{name:stringconstructor(name:string){this.name = name}//定义一个抽象方法//抽象方法使用abstract开头,没有方法体//抽象方法只能定义在抽象类,子类必须对抽象方法进行重写abstract say():void}class Dog extends Animal{say(){}}const dog = new Dog('旺财')dog.say()})()
接口(interface,implements)
接口来定义一个类结构,用来定义一个类中应该包含那些属性和方法
同时接口也可以当成类声明去使用
接口可以定义类的时候去限制类的结构
接口中所有的属性都不能有实际的值
接口定义对象的结构,而不考虑实际值
在接口中所有的方法都是抽象方法
定义类时,可以使类去实现一个接口
实现接口就是使类满足接口的需求
(function(){//描述一个对象的类型type myType ={name:string,age:number}/*** 接口来定义一个类结构,用来定义一个类中应该包含那些属性和方法* 同时接口也可以当成类声明去使用*/interface myInterface{name:string,age:number}interface myInterface{gender:string}const obj:myInterface ={name:'123',age:123,gender:'男'}/*** 接口可以定义类的时候去限制类的结构* 接口中所有的属性都不能有实际的值* 接口定义对象的结构,而不考虑实际值* 在接口中所有的方法都是抽象方法*/interface myInter{name:stringsay():void}/*** 定义类时,可以使类去实现一个接口* 实现接口就是使类满足接口的需求*/class myClass implements myInter{name:stringconstructor(name:string){this.name = name}say(){console.log('hello')}}})()
属性的封装(public,private,protected)
(function () {class Person {//TS可以在属性前添加属性的修饰符/*** public 修饰的属性可以在任意位置访问(修改)是默认值* private 私有属性,私有属性只能在类内部进行修改* 通过在类中添加方法使得私有属性可以在外部被访问* protected 受保护的属性,只能在当前类的子类中访问(修改)*/private name: stringprivate age: numberconstructor(name: string, age: number) {this.name = namethis.age = age}/*** getter方法用来读取属性* setter方法用来设置属性* 他们称为属性的存取器**/getName() {return this.name}setName(value: string) {this.name = value}getAge() {return this.age}setAge(value: number) {if (value >= 0) {this.age = value}}//ts中设置getter方法的方式get _name(){console.log('get name()!!!!')return this.name}set _name(value: string){this.name = value}}const pre = new Person('zz', 13)/*** 现在属性是在对象中设置的,属性可以任意的被修改* 属性可以任意被修改将会导致对象中的数据变得非常不安全*///console.log(pre.name)//报错pre.setName('xx')pre.setAge(-10)pre._name = 'yy'console.log(pre._name)class A{protected num:numberconstructor(num:number){this.num = num}}class B extends A{test(){console.log(this.num)}}const b = new B(213)//console.log(b.num) //报错// class C{// name:string// age:number// constructor(name:string,age:number){// this.name = name// this.age = age// }// }class C{//可以直接将属性定义在构造函数中constructor(public name:string,public age:number){}}const c = new C('xx',12)})()
