TypeScript类与继承和修饰符public 、private 、protected 的详细讲解

  • A+
所属分类:Web前端

1.我理解的类

类可以理解成为一个模板,通过这个模板可以实例化某一个具体对象 比如说:我们定义一个动物类, 通过这个动物模板可以实例化成为猫或者其他具体的动物 

2.类的基本使用

我们需要创建一个动物类; 这个动物有姓名、【默认值小可爱,字符串类型】 年龄、【默认值 20,数字类型】 性别、【字符串类型】 体重、【数字类型】 爱好【爱好可有可无,如果有必须是一个数组类型的】 这个动物类还有一个say的实例方法 下面我们就开始实现 
class Animails {     name: string     age: number     gender: string     weight: string     likes?: Array<any>     //爱好这个属性可有可无,如果有必须是数组类型     // 定义构造函数:为了将来实例化对象的时候,      // 构造器直接对属性进行初始化     // 需要给名称默认值小可爱、年龄默认值age=20     constructor(         name: string = '小可爱',         age: number = 20,         gender: string,         weight: string,         likes?: Array<any>     ) {         // 初始化属性中的数据         this.name = name         this.age = age         this.gender = gender         this.weight=weight     }     // 定义实例方法     say() {         console.log(             `大家好我是${this.name},             今年${this.age}岁了,             性别:${this.gender},             体重:${this.weight},         `);     } } // 实例化对象 let pig = new Animails('猪猪侠', 10, '男', '30kg'); pig.say();//调用实例方法 

TypeScript类与继承和修饰符public 、private 、protected 的详细讲解

3.实例化类的注意点

当类中的属性都有默认值时, 实例化对象的时候, 可以不用进行进行初始化。 类中的属性如果没有默认值,不是可选属性。必须一一赋值(初始化) 就是说: 我们必须对构造器中的属性进行一一赋值 除非构造器中有默认值 
class Animails {     name: string     age: number     constructor(         name: string = '小可爱',         age: number = 20,     ) {         // 初始化属性中的数据         this.name = name         this.age = age     }     // 定义实例方法     say() {         console.log( `大家好我是${this.name}, 今年${this.age}岁了, `);     } } // 实例化对象 let pig = new Animails(); pig.say();//调用实例方法 

4.类与类之间的继承

A类继承了B类,那么A类叫做子类;B类叫做基类 子类--->又叫派生类 基类--->又叫父类或者超类 
下面这个例子我们将子类MySon将会去继承Father父类。 子类有属于自己的方法sonsay; 子类可以去调用父类的方法super.say('子类'); 同时我们在子类中将会去重写父类的方法 
// 我们定义了一个超类【父类】 class Father {     // 定义属性     name: string     age: number     // 定义构造函数     constructor(name: string, age: number) {         // 初始化属性中的数据         this.name = name         this.age = age     }     // 定义实例方法     say(str:string) {         console.log( `大家好我是${this.name}, 今年${this.age}岁了,${str}呼喊的我 `);     } }  // 子类去继承了父类 class MySon extends Father {     // constructor中的参数必须要满足父类。     // 除非父类有默认参数或者父类中的属性不是必须属性。     constructor(name: string, age: number) {         // super调用父类中的构造函数         super(name,age)     }     // 子类中自己的实例方法     sonsay() {         console.log('我是子类哈哈');         //调用父类中的实例方法         super.say('子类');     }      // 重写父类的方法     say(name:string) {         console.log(`我重写了父类的方法我是${name}`)     } } // 进行实例化 let xiaoming = new MySon('小明', 19); // 进行方法调用  xiaoming.sonsay(); xiaoming.say('小明'); 

TypeScript类与继承和修饰符public 、private 、protected 的详细讲解

5.修饰符的理解

修饰符:主要用于描述类中的成员(属性、方法、构造函数,)的可访问行 当一个类的成员变量没有修饰的时候, 默认的就是 public 进行修饰。 外界是可以进行访问的。任何位置都可以访问类中的成员  private 属性【只能够】在父类的内部直接进行访问; class Person{     age:10     // private 属性只能够 在类的内部 进行访问;     private name = "张三"      say() {         console.log("我的名字是"+this.name)     } } 

6.private的理解

如果父类定义的私有属性或者方法的时候, 那么继承的子类是不可以访问父类中的私有属性和私有方法 在实例化的时候也是不可以访问私有属性和私有方法  子类继承父类后  访问父类属性通过this.属性名 调用父类的方法 this.方法名  下面我们看一下: 子类是否可以访问父类中的私有属性? 实例化后是否可以访问父类中的私有属性? 
class Person {     age: 10;     // private 属性只能够在类的内部进行访问;     private name = "张三";     say() {       //内部访问是ok的哈       console.log("我的名字是" + this.name);     } } class Children extends Person {     sayage() {         console.log('访问父类属性年龄',this.age)     }     // 下面这种访问是非法的会报错      sayname() {         console.log('访问父类属性姓名',this.name)     } } var xm = new Children(); xm.say();//我的名字是张三 // 报错,因为name是父类私有的, // 实例化的时候不能够进行访问  console.log( xm.name ) 

7.protected 的理解

protected修饰的属性和方法是受保护的, 只能够在父类和其子类中访问。 实例化后是不能够访问protected所修饰的属性和方法 
class Person {     protected age:string     constructor(age:string) {       this.age=age     }     say() {         console.log("我的年龄是" + this.age);     } }  // 继承父类 class Children extends Person {     callPar() {       super.say(); //super 可以调用父类中的属性方法     }     hello() {       console.log("我今年" + this.age);     } }  var xm = new Children('10'); xm.hello(); //我今年10 <!-- 提示 属性“age”受保护,只能在类“Person”及其子类中访问 --> console.log(xm.age)