面向对象 面向对象,ObjectOriented,软件开发方法,一种编程范式。 面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。 面向对象的三大特性:封装、继承、多态。 TypeScript面向对象,类(class) 1、static关键字,表示一个静态属性,通过类访问。 2、readonly关键字,表示一个只读属性,不能修改属性,构造函数可初始化。 构造函数和this关键字 1、constructor函数,称为构造函数,对象创建时调用。 2、在实例方法中,this就表示当前当前的实例。 继承(extends)和super关键字 1、子类写了constructor构造函数必须使用super继承父类constructor构造函数的属性 2、通过继承可以将多个类中共有的代码写在一个父类中,继承后子类将会拥有父类所有的方法和属性。 3、方法重写,子类中添加了和父类相同的方法,子类方法会覆盖掉父类的方法 抽象(abstract) 1、以abstract开头的类是抽象类,抽象类不能实例化,事专门用来被继承的类。 2、抽象类中可以添加抽象方法,非抽象类中不可以有抽象方法。 3、抽象方法使用abstract开头,没有方法体,只能定义在抽象类中,子类必须对抽象方法进行重写。 接口(interface) 1、接口的作用类似于抽象类,不同点在于接口中的所有函数和属性都是没有实值的,接口中的所有方法都是抽象方法。 2、接口主要负责定义一个类的结构,限制一个对象的接口,对象只有包含接口中定义的所有属性和方法时才能匹配接口。 3、一个类去实现接口,实现接口时类中要包括接口中的所有属性。 封装和属性的封装 1、private修饰符,私有的属性,私有属性只能在类内部进行访问修改。 2、protected修饰符,受保护的属性,只能在当前类和当前类的子类中访问。 3、public修饰符,共有的属性,修饰的属性可以再任意位置访问修改默认值。 4、getter方法用来读取属性。 5、setter方法迎来设置属性。 6、getter和setter被统一称为属性的存储器,定义时在方法之前添加get和set,调用的时候直接通过点语法调用。代码案例 案例1:classMyUser{staticdesc:string用户类;使用static开头的属性是静态属性(类属性),可以直接通过类去访问readonlyid:number1000004;readonly开头的属性表示一个只读的属性无法修改name:string张三;age:number28;toString(){returnidthis。id,namethis。name,agethis。age;}}letmyUsernewMyUser();console。log(myUser,myUser);myUserMyUser{id:1000004,name:张三,age:28}console。log(myUser。desc,MyUser。desc);myUser。desc用户类 案例2:classMyUser2{readonlyid:number;name:string;age:number;构造函数和thisparamidparamnameparamageconstructor(id:number,name:string,age:number){this。idid;this。namename;this。ageage;}toString(){returnidthis。id,namethis。name,agethis。age;}}letmyUser2newMyUser2(1000001,孔子,2000);console。log(myUser2,myUser2);myUser2MyUser2{id:1000001,name:孔子,age:2000} 案例3:(function(){以abstract开头的类是抽象类,抽象类和其他类区别不大,不能用来创建对象抽象类就是专门用来被继承的类抽象类中可以添加抽象方法abstractclassMyUser3{readonlyid:number;name:string;age:number;构造函数和thisparamidparamnameparamageconstructor(id:number,name:string,age:number){this。idid;this。namename;this。ageage;}toString(){returnidthis。id,namethis。name,agethis。age;}抽象方法使用abstract开头,没有方法体抽象方法只能定义在抽象类中,子类必须对抽象方法进行重写abstractwork():void;}classMyEmployeeextendsMyUser3{构造函数paramidparamnameparamageconstructor(id:number,name:string,age:number){super(id,name,age);}work(){console。log(雇员,idthis。id,namethis。name在工作);}}classMyManagerextendsMyUser3{work(){console。log(经理,idthis。id,namethis。name在工作);}}letmyEmployeenewMyEmployee(1,沙僧,501);myEmployeeMyEmployee{id:1,name:沙僧,age:501}console。log(myEmployee,myEmployee);myEmployee。work();雇员,id1,name沙僧在工作letmyManagernewMyManager(1,唐僧,500);myManagerMyManager{id:1,name:唐僧,age:500}console。log(myManager,myManager);myManager。work();经理,id1,name唐僧在工作})(); 案例4:interfaceMyWorker{work():void;}classMyUser4implementsMyWorker{readonlyid:number1000004;readonly开头的属性表示一个只读的属性无法修改name:string张三;age:number28;toString(){returnidthis。id,namethis。name,agethis。age;}work(){console。log(用户,idthis。id,namethis。name在工作);}}letmyUser4newMyUser4();myUser4MyUser4{id:1000004,name:张三,age:28}console。log(myUser4,myUser4);myUser4。work();用户,id1000004,name张三在工作 案例5:(function(){定义一个表示人的类classPerson{TS可以在属性前添加属性的修饰符public,修饰的属性可以在任意位置访问(修改)默认值private,私有属性,私有属性只能在类内部进行访问(修改)通过在类中添加方法使得私有属性可以被外部访问protected受包含的属性,只能在当前类和当前类的子类中访问(修改)privatename:string;privateage:number;构造函数paramnameparamageconstructor(name:string,age:number){this。namename;this。ageage;}getter方法用来读取属性setter方法用来设置属性它们被称为属性的存取器TS中设置getter方法的方式getname(){console。log(getname()执行了!!);returnthis。name;}setname(value){this。namevalue;}getage(){returnthis。age;}setage(value){if(value0){this。agevalue}}}constpersonnewPerson(孙悟空,18);现在属性是在对象中设置的,属性可以任意的被修改,属性可以任意被修改将会导致对象中的数据变得非常不安全person。setName(猪八戒);person。setAge(33);person。name猪八戒;person。age33;console。log(person);classA{protected是保护的属性,只能在当前类和子类中设置protected只能在当前类和当前类的子类中设置protectednum:number;constructor(num:number){this。numnum;}}classBextendsA{test(){console。log(this。num);}}constbnewB(123456789);b。num33;属性num受保护,只能在类A及其子类中访问。classC1{name:string;age:number可以直接将属性定义在构造函数中constructor(name:string,age:number){this。namename;this。ageage;}}constc1newC1(沙僧,111222333);console。log(c1);C1{name:沙僧,age:111222333}classC2{直接将属性定义在构造函数中constructor(publicname:string,publicage:number){}}constc2newC2(沙僧,111222333);console。log(c2);C2{name:沙僧,age:111222333}})();