学习来源:学习TypeScrip8(Class类)_小满zs的博客-CSDN博客
ES6 提供了更接近传统语言的方法,引入了Class类 这个概念,作为对象的模板。 通过 Class 关键字,可以定义类。基本上,ES6 的Class可以看做只是一个语法糖,它的绝大部分功能,ES5都可以实现,新的 Class写法只是让对象原型的写法更加清晰、更像面向对象的编程的语法而已。上面的代码用 ES6 的类改写,就是下面这样。
// 定义类
Class Person {
constructor (){
}
run(){}
}
1. 在 TS 中,是如何定义类的?
1. 在typescript 中是不允许直接在constructor定义变量的,需要在constructor上面先声明;
2.在1的基础上引发出第二个问题,如果定义了变量,不用,也会报错;通常是给个默认值或者进行赋值。效果如下
class Person {
name: string
age: number
constructor (name: string , age: number){
this.name = name
}
run (){}
}
2. 类的修饰符
总共有单个 public private protected
1.使用public修饰符,可以让你定义的变量,内部访问,也可以外部访问,如果不写,默认就是public;
2.使用private 修饰符,代表定义的变量私有的只能在内部访问,外部不能访问;
3.使用protected修饰符,代表定义的变量私有的,只能在内部和继承的子类中访问,不能在外部访问;
class Person {
public name: string
private age: number
protected some: any
constructor (name: string, ages: number, some: any){
this.name = name
this.age = ages
this.some = some
}
run (){}
}
class Man extends Person {
constructor (){
super('张三', 18,1)
console.log(this.some)
}
create(){
console.log(this.some)
}
}
let xiaoman = new Person('小满', 18, 1)
let man = new Man()
3. static 静态属性 和静态方法
1. static 定义的属性,不可以通过this去访问,只能通过类型调用
2.static 静态函数,同样也是不能通过this去调用,可是通过类型去调用
3.注意:如果两个函数都是static 静态的,可以通过this互相调用
class Person {
public name: string
private age: number
protected some: any
static nb: string = '123'
constructor (name: string, ages: number, some: any){
this.name = name
this.age = ages
this.some = some
}
static run (){
return this.aaa()
}
static aaa(){
return 'aaaaa'
}
}
Person.nb
4. interface 定义类
typescript interface定义类,使用关键字 implements 后面跟 interface的名字,多个就用逗号隔开,继承还是用extends
interface PersonClass {
get(type: boolean): boolean
}
interface PersonClass2 {
set(): void,
asd: string
}
class A {
name: string,
constructor(name: string){
this.name = '123'
}
}
class Person extends A implements PersonClass, PersonClass2 {
asd: string
constructor(){
super()
this.asd = '123'
}
get(type: boolean){
return type
}
set(){}
}
5.抽象类
应用场景如果你写的类实例化之后毫无用处,此时我们可以把它定义为抽象类
或者你也可以把他作为一个基类 -> 通过继承一个派生类去实现基类的一些方法
例子如下
下面这段代码会报错,抽象类无法被实例化
abstract class A {
public name: string
}
new A()
例子2
我们在A类定义了 getName 抽象方法,但未实现
我们B类实现了A定义的抽象方法,如不实现就不报错 我们定义的抽象方法必须在派生类实现
abstract class A {
name: string
constructor (name: string){
this.name = name
}
print(): string{
return this.name
}
abstract getName(): string
}
class B extends A {
constractor(){
super('小满')
}
getName(): string {
return this.name
}
}
let b = new B()
console.log(b.getName())