TypeScript 支持通过 getters/setters 来截取对对象成员的访问。 它能帮助你有效的控制对对象成员的访问。
/*
* @Description:
* @Author: 若城
* @Date: 2024-01-16 17:20:51
* @LastEditTime: 2024-01-16 17:33:11
*/
// 存取器: 让我们可以有效的控制对 对象中的成员的访问, 通过getters 和setters 来进行操作
(()=>{
// 外部可以传入姓氏和名字数据, 同时使用set 和 get 控制姓名的数据, 外部也可以进行修改操作
class Person{
firstName: string
lastName: string
constructor(firstName:string , lastName: string){
this.firstName = firstName
this.lastName = lastName
}
// 姓名的成员属性(外部可以访问, 也可以修改 )
// 读取器 - 负责读取数据的
get fullName(){
console.log('get中...');
return this.firstName +'_'+ this.lastName
}
// 设置器 - 负责设置数据的(修改)
// set fullName(){
// // 将获取到的数据重新复制给firstName 和 lastName
// }
}
// 实例化对象
const person:Person = new Person('令狐', '冲')
console.log(person);
// 获取该属性的成员属性
console.log(person.fullName);
})()
** 代码中我们获取该属性的成员属性时 get 会被触发**
但是如果我们像设置该属性的数据时就会报错 , 此时我们就要使用set 属性进行修改
//设置该属性的数据
person.fullName = '诸葛_孔明'
/*
* @Description:
* @Author: 若城
* @Date: 2024-01-16 17:20:51
* @LastEditTime: 2024-01-16 17:38:06
*/
// 存取器: 让我们可以有效的控制对 对象中的成员的访问, 通过getters 和setters 来进行操作
(()=>{
// 外部可以传入姓氏和名字数据, 同时使用set 和 get 控制姓名的数据, 外部也可以进行修改操作
class Person{
firstName: string
lastName: string
constructor(firstName:string , lastName: string){
this.firstName = firstName
this.lastName = lastName
}
// 姓名的成员属性(外部可以访问, 也可以修改 )
// 读取器 - 负责读取数据的
get fullName(){
console.log('get中...');
return this.firstName +'_'+ this.lastName
}
// 设置器 - 负责设置数据的(修改)
set fullName(val){
console.log('set中....');
// 将获取到的数据重新复制给firstName 和 lastName
let names = val.split('_')
this.firstName = names[0]
this.lastName = names[1]
}
}
// 实例化对象
const person:Person = new Person('令狐', '冲')
console.log(person);
// 获取该属性的成员属性
console.log(person.fullName);
// 设置该属性的数据
person.fullName = '诸葛_孔明'
console.log(person.fullName);
})()
添加设置器
// 设置器 - 负责设置数据的(修改)
set fullName(val){
console.log('set中....');
// 将获取到的数据重新复制给firstName 和 lastName
let names = val.split('_')
this.firstName = names[0]
this.lastName = names[1]
}
修改并调用
// 设置该属性的数据
person.fullName = '诸葛_孔明'
console.log(person.fullName);
效果如下
在类中通过static 修饰的属性或者方法,那么就是静态的属性及静态的方法, 也称之为:静态成员 静态成员在使用的时候是通过类名.的这种语法来调用的
在constructor 中的name1 会报错 ,原因如下 : 此时this 是实例对象,name1 是静态属性,不能通过实例对象直接调用将他属性来使用
/*
* @Description:
* @Author: 若城
* @Date: 2024-01-16 17:42:38
* @LastEditTime: 2024-01-16 17:55:28
*/
// 静态成员: 在类中通过static 修饰的属性或者方法,那么就是静态的属性及静态的方法, 也称之为:静态成员
// 静态成员在使用的时候是通过类名.的这种语法来调用的
(()=>{
// 定义一个类
class Person{
// 类中默认有一个内置的name 属性, 因此 如果static 的静态属性 是name 的话会报错
// 静态属性:
static name1:string
constructor(name:string){
this.name1 = name
}
sayHi(str?:string):void{
console.log('还有谁');
}
}
// 实例化对象
const person: Person = new Person('张无忌')
// 通过实例对象调用的属性(实例属性)
console.log(person.name1);
// 通过实例对象调用的方法(实例方法)
person.sayHi()
})()
报错信息如下
/*
* @Description:
* @Author: 若城
* @Date: 2024-01-16 17:42:38
* @LastEditTime: 2024-01-16 18:07:07
*/
// 静态成员: 在类中通过static 修饰的属性或者方法,那么就是静态的属性及静态的方法, 也称之为:静态成员
// 静态成员在使用的时候是通过类名.的这种语法来调用的
(()=>{
// 定义一个类
class Person{
// 类中默认有一个内置的name 属性, 因此 如果static 的静态属性 是name 的话会报错
// 静态属性:
static name1:string ='张无忌'
constructor(name?:string){
// 此时this 是实例对象,name1 是静态属性,不能通过实例对象直接调用将他属性来使用
// this.name1 = name
}
sayHi(str?:string):void{
console.log('还有谁');
}
}
// 实例化对象
// const person: Person = new Person()
// 通过实例对象调用的属性(实例属性)
// console.log(person.name1);
// 通过实例对象调用的方法(实例方法)
// person.sayHi()
// 通过类名.静态属性的方式来访问该成员的数据
console.log(Person.name1);
// 通过类名.静态属性的方式来设置改成员数据
Person.name1 = '赵敏'
console.log(Person.name1);
})()
通过类名.静态方法的方式来调用内部的静态的方法 注意: 构造函数是不能通过static 来进行修饰的
/*
* @Description:
* @Author: 若城
* @Date: 2024-01-16 17:42:38
* @LastEditTime: 2024-01-16 18:14:16
*/
// 静态成员: 在类中通过static 修饰的属性或者方法,那么就是静态的属性及静态的方法, 也称之为:静态成员
// 静态成员在使用的时候是通过类名.的这种语法来调用的
(()=>{
// 定义一个类
class Person{
// 类中默认有一个内置的name 属性, 因此 如果static 的静态属性 是name 的话会报错
// 静态属性:
static name1:string ='张无忌'
constructor(name?:string){
// 此时this 是实例对象,name1 是静态属性,不能通过实例对象直接调用将他属性来使用
// this.name1 = name
}
static sayHi(str?:string):void{
console.log('还有谁');
}
}
// 实例化对象
// const person: Person = new Person()
// 通过实例对象调用的属性(实例属性)
// console.log(person.name1);
// 通过实例对象调用的方法(实例方法)
// person.sayHi()
// 通过类名.静态属性的方式来访问该成员的数据
console.log(Person.name1);
// 通过类名.静态属性的方式来设置改成员数据
Person.name1 = '赵敏'
console.log(Person.name1);
// 通过类名.静态方法的方式来调用内部的静态的方法
Person.sayHi()
})()
抽象类做为其它派生类的基类使用。 它们不能被实例化。不同于接口,抽象类可以包含成员的实现细节。 abstract 关键字是用于定义抽象类和在抽象类内部定义抽象方法。
/*
* @Description:
* @Author: 若城
* @Date: 2024-01-17 10:26:14
* @LastEditTime: 2024-01-17 11:49:22
*/
// 抽象类: 包含抽象方法, (抽象方法一般没有任何具体的内容实现), 也可以包含实例方法, 抽象类是不能被实例化 , 为了让子类进行实例化及实现内部的抽象方法
(()=>{
// 定义一个抽象类
abstract class Animal{
// 抽象方法
abstract eat()
// 会报错, 抽象方法不能有具体的实现
// abstract eat(){
// console.log('具体方法实现');
// }
// 实例方法
run(){
console.log('实例方法');
}
}
// 不能实例化抽象类的对象
const ani:Animal = new Animal()
不能实例化抽象类的对象
可以在子类(派生类)中进行抽象类的抽象方法的实现
/*
* @Description:
* @Author: 若城
* @Date: 2024-01-17 10:26:14
* @LastEditTime: 2024-01-17 11:49:22
*/
// 抽象类: 包含抽象方法, (抽象方法一般没有任何具体的内容实现), 也可以包含实例方法, 抽象类是不能被实例化 , 为了让子类进行实例化及实现内部的抽象方法
(()=>{
// 定义一个抽象类
abstract class Animal{
// 抽象方法
abstract eat()
// 会报错, 抽象方法不能有具体的实现
// abstract eat(){
// console.log('具体方法实现');
// }
// 实例方法
run(){
console.log('实例方法');
}
}
// 定义一个子类(派生类)Dog
class Dog extends Animal{
eat() {
console.log('狗的抽象方法');
}
}
// 不能实例化抽象类的对象
// const ani:Animal = new Animal()
// 实例化Dog 对象
const dog:Dog = new Dog()
dog.eat()
})()