TypeScript 是面向对象的 JavaScript。类描述了所创建的对象共同的属性和方法。TypeScript 支持面向对象的所有特性
1.1、类的定义
- class class_name {
- // 类作用域
- }
类可以包含以下几个模块(类的数据成员):
例如:
- class Car {
- // 字段
- engine:string;
- // 构造函数
- constructor(engine:string) {
- this.engine = engine
- }
- // 方法
- disp():void {
- console.log("发动机为 : "+this.engine)
- }
- }
this 关键字表示当前类实例化的对象。注意构造函数的参数名与字段名相同,this.engine 表示类的字段。
1.2、创建实例化对象:使用 new 关键字来实例化类的对象,语法格式如下:
var object_name = new class_name([ arguments ])
类实例化时会调用构造函数,例如:
var obj = new Car("Engine 1")
类中的字段属性和方法可以使用 . 号来访问:
// 访问属性
obj.field_name
// 访问方法
obj.function_name()
示例:
- // 创建一个对象
- var obj = new Car("XXSY1");
- // 访问字段
- console.log("读取发动机型号 : " + obj.engine);
- // 访问方法
- obj.disp();
TypeScript 支持继承类,即我们可以在创建类的时候继承一个已存在的类,这个已存在的类称为父类,继承它的类称为子类。
类继承使用关键字 extends,子类除了不能继承父类的私有成员(方法和属性)和构造函数,其他的都可以继承。
TypeScript 一次只能继承一个类,不支持继承多个类,但 TypeScript 支持多重继承(A 继承 B,B 继承 C)。
实例:
- class Shape {
- Area:number
- constructor(a:number) {
- this.Area = a
- }
- }
-
- class Circle extends Shape {
- disp():void {
- console.log("圆的面积: "+this.Area)
- }
- }
-
- var obj = new Circle(223);
- obj.disp()
例如:
- class PrinterClass {
- doPrint():void {
- console.log("父类的 doPrint() 方法。")
- }
- }
-
- class StringPrinter extends PrinterClass {
- doPrint():void {
- super.doPrint() // 调用父类的函数
- console.log("子类的 doPrint()方法。")
- }
- }
三、static 关键字:用于定义类的数据成员(属性和方法)为静态的,静态成员可以直接通过类名调用。
例如:
- class StaticMem {
- static num:number;
- static disp():void {
- console.log("num 值为 "+ StaticMem.num)
- }
- }
- StaticMem.num = 12 // 初始化静态变量
- StaticMem.disp() // 调用静态方法
四、instanceof 运算符:用于判断对象是否是指定的类型,如果是返回 true,否则返回 false。
- class Person{ }
-
- var obj = new Person()
- var isPerson = obj instanceof Person;
- console.log("obj 对象是 Person 类实例化来的吗? " + isPerson);
五、类属性权限修饰符:TypeScript 中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。TypeScript 支持 3 种不同的访问权限。
- class Person{
- public name:string;
- public age:number;
- constructor(name:strng,age:number){
- this.name=name;
- this.age=age;
- }
- cons(text:string){
- console.log(`Hi! ${this.name},${text}`);
- }
- }
- class Person{
- protected name:string;
- public age:number;
- constructor(name:strng,age:number){
- this.name=name;
- this.age=age;
- }
- }
- class Man extends Person{
- sex:string;
- constructor(name:strng,age:number,sex:string;){
- super(name,age)
- this.sex=sex
- }
- cons(text:string){
- console.log(`Hi! ${this.name},${text}`);
- }
- }
- new Man("Cat",12).name; // 错误,name是保护属性
- class Person{
- private name:string;
- public age:number;
- constructor(name:strng,age:number){
- this.name=name;
- this.age=age;
- }
- cons(text:string){
- console.log(`Hi! ${this.name},${text}`);
- }
- }
- new Person("Cat",12).name; // 错误: 'name' 是私有的.
- class Person{
- readonly name:string;
- public age:number;
- constructor(name:strng,age:number){
- this.name=name;
- this.age=age;
- }
- }
- let dad =new Person("Cat",12);
- dad.name = "小明"; // 错误! name 是只读的.
六、存取器:TypeScript支持通过getters/setters来截取对对象成员的访问。
- class Person{
- private _name:string;
- get name():string{
- return this._name;
- }
- set name(name:string){
- this._name=name;
- }
- }
- let man = new Employee();
- man.name='小明';
七、TypeScript对象:对象是包含一组键值对的实例。 值可以是标量、函数、数组、对象等,实例如下:
- var object_name = {
- key1: "value1", // 标量
- key2: "value",
- key3: function() { // 函数 },
- key4:["content1", "content2"] //集合
- }
1、对象字面量表示法
- var person = {
- firstname:"Tom",
- lastname:"Hanks"
- };
- console.log(person.firstname)
- console.log(person.lastname)
2、TypeScript 类型模板
- var sites = {
- site1: "Runoob",
- site2: "Google",
- sayHello: function () { } // 类型模板
- };
- sites.sayHello = function () {
- console.log("hello " + sites.site1);
- };
- sites.sayHello();
3、对象作为函数参数
- var person = {
- firstname:"Tom",
- lastname:"Hanks"
- };
- var invokeperson = function(obj: { firstname:string, lastname :string }) {
- console.log("first name :"+obj.firstname)
- console.log("last name :"+obj.lastname)
- }
- invokeperson(person);
4、匿名对象
- var invokeperson = function(obj:{ firstname:string, lastname :string}) {
- console.log("first name :"+obj.firstname)
- console.log("last name :"+obj.lastname)
- }
- invokeperson({firstname:"Sachin",lastname:"Tendulkar"});
八、抽象类和抽象方法
示例:Animal 类要求它的子类必须包含eat方法
- abstract class Animal{
- public name:string;
- constructor(name:string){
- this.name=name;
- }
- abstract eat():any; //抽象方法不包含具体实现并且必须在派生类中实现。
- run(){
- console.log('其他方法可以不实现')
- }
- }
- //var a=new Animal() /*错误,抽象类不能实例化*/
- class Dog extends Animal{
- constructor(name:any){
- super(name)
- }
- eat(){//抽象类的子类必须实现抽象类里面的抽象方法
- console.log(this.name+'吃粮食')
- }
- }
-
- var d=new Dog('小花花');
- d.eat();
- --------------------------------------------------------------
- class Cat extends Animal{
- constructor(name:any){
- super(name)
- }
- run(){}
- eat(){ //抽象类的子类必须实现抽象类里面的抽象方法
- console.log(this.name+'吃老鼠')
- }
- }
-
- var c=new Cat('小花猫');
- c.eat();
附:
面向对象的七大原则: