类与继承及修饰符public 、private 、protected 的使用方法
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();//调用实例方法 // 大家好我是猪猪侠,今年10岁了,性别:男,体重:30kg.
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(); // 我是子类哈哈 // 大家好我是小明,今年19岁了,子类呼喊的我
xiaoming.say('小明'); // 我重写了父类的方法我是小明
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)