前言

今天继续typescript的学习,开始ts类的学习。

类的实现

在ES6中新增了类的概念。我们先看ES6中类的实现。

class Person {
constructor(name,age){
this.name = name;
this.age = age;
}
getName(){
return this.name;
}
}
let p1 = new Person('小张',24)
console.log(p1.getName())

在ts中类的定义。ts中类的定义跟ES6差别不大。只是ts中新增了对属性的类型的校验。因此我们在使用属性之前必须先定义属性的类型。比如下面Person类中的name和age属性。在constructor和getName中使用之前必须先指定其类型。

class Person {
// 指定参数类型
name:string;
age:number;
constructor(name:string,age:number){
this.name = name;
this.age = age;
} getName():string{
return this.name;
} } let p1 = new Person('小红',24)
console.log(p1.getName())

类的继承

ES6中的继承:在ES6中通过extends和super来实现继承。

// ES6中的继承
class Student extends Person{
constructor(name,age,sex){
super(name,age);
this.sex = sex;
}
getSex(){
return this.sex
}
} let s = new Student('小李',25,'男')
console.log(s.getName())
console.log(s.getSex())

ts中类的继承和ES6中非常相似。

class Person {
// 指定参数类型
name:string;
age:number;
constructor(name:string,age:number){
this.name = name;
this.age = age;
} getName():string{
return this.name;
} } let p1 = new Person('小红',24)
console.log(p1.getName()) // 类的继承
class Student extends Person{
sex:string;
constructor(name:string,age:number,sex:string){
super(name,age);
this.sex = sex;
}
getSex():string{
return this.sex
}
}

修饰符

在ts中定义属性的时候,提供了三种修饰符。分别是public,protected和private。这三种修饰符用来表示属性能够被访问的范围。

public    表示公有的 可以在类中,类外面,子类中被访问。

protected  表示被保护的类型 可以在类中和子类中被访问。不能在类外面被访问。

private 表示私有类型 可以在类中访问。在子类和类外部都无法访问。

1.public、protected和private修饰符定义的属性在类内部都可以被访问。

class Human {
// 指定参数类型
public name:string;
protected age:number;
private salary:string;
constructor(name:string,age:number,salary:string){
this.name = name;
this.age = age;
this.salary = salary;
}
getName():string{
return this.name;
}
getAge():number{
return this.age;
}
getSalary():string{
return this.salary;
}
}

2.public修饰符定义的属性在类外部可以被访问。protected和private修饰符定义的属性在类外部无法被访问。

当我们在外部访问privagte定义的属性时,会出现报错。

这里的salary是private修饰的属性,无法进行设置。

let h2 = new Person('小红',24,10000) // Expected 2 arguments, but got 3.
console.log(h1.getAge()); // 报错 protected修饰的age属性无法在外部被访问。

3.public和protected修饰符定义的属性可以在子类中被访问。但是private修饰符定义的属性无法在子类中访问。

比如,当子类继承父类。调用super()方法时,如果传入了父类中私有的属性那么会报错。如果在子类方法中想要获取父类

私有属性也会报错。

class People extends Person{
constructor(name:string,age:number,sex:string){
super(name,age,sex); // 报错
}
getSex():string{
return this.sex; // 报错
}
}

readonly修饰符

在ts中还提供了readonly修饰符来将属性设置为只读。只读属性必须在生明时或者构造函数中被初始化。

class Teacher {
readonly name:string;
constructor(name:string){
this.name = name;
}
getName():string{
return this.name
}
} let t = new Teacher('张三')
console.log(t.name);
console.log(t.getName());
t.name = '李四' // 修改readonly 修饰的属性时报错。

静态方法

在ES6中,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。

class Foo{
constructor(name,age){
this.name = name;
this.age = age;
}
getName(){
return this.name;
}
static getAge(){
return this.age;
}
} let f = new Foo('刘亦菲',24);
console.log(f.getName()) // 刘亦菲
console.log(Foo.getAge()) // undefined 这里的this指的是类Foo
console.log(f.getAge()) // 静态方法无法被实例调用

ts中静态方法的使用:通过使用static关键字定义静态属性和静态方法。

静态属性和静态方法只能通过类名来进行访问。实例和this都无法进行访问。

// 静态方法
class Foo{
// 静态属性
static obj = {
name:'刘亦菲',
age:30
}
public name:string
constructor(name:string){
this.name = name;
}
// 静态方法
static getAge(){
// 调用静态属性时需要使用类来调用。
return Foo.obj.age
}
getName(){
return this.name
}
} let f = new Foo('晓明')
console.log(Foo.getAge()) // 调用静态方法
console.log(f.getName()) // 调用实例方法

抽象类

抽象类是作为其他继承类的基类使用。他们一般不会被实例化。在ts中用abstract定义抽象类和抽象方法。

abstract class Animal{
abstract eat():any;
}

1.抽象类无法被实例化

abstract class Animal{
abstract eat():any;
}
let a = new Animal() // 报错Cannot create an instance of an abstract class

2.抽象类中的抽象方法,不包含具体实现。只定义方法签名,不定义方法体。

abstract class Animal{
abstract eat():any; // 只有方法名,没有方法体
abstract play:any{} // 报错 抽象方法不能有实现,也就是说不能有方法体。
}

3.抽象类的子类必须实现抽象类中的抽象方法。

// 抽象类
abstract class Animal{
protected food:string;
protected ball:string;
constructor(food:string,ball:string){
this.food = food;
this.ball = ball;
}
abstract eat():any;
abstract play():any;
} // 子类
class Dog extends Animal{
constructor(food:string,ball:string){
super(food,ball)
}
// 必须实现抽象类中的抽象方法
eat(){
console.log(`小狗在吃${this.food}`)
}
play(){
console.log(`小狗在玩${this.ball}`)
}
} let dog = new Dog('骨头','篮球')
dog.eat()
dog.play()

Typescript基础(3)——类的更多相关文章

  1. TypeScript 基础入门(一)

    1.TypeScript是什么? TypeScript 是 JavaScript 的一个超集,TypeScript 在 JavaScript 的基础上添加了可选的 静态类型 和基于 类 的面向对象编程 ...

  2. TypeScript基础以及在Vue中的应用

    TypeScript推出已经很长时间了,在Angular项目中开发比较普遍,随着Vue 3.0的即将推出,TypeScript在Vue项目中使用也即将成为很大的趋势,笔者也是最近才开始研究如何在Vue ...

  3. springMVC基础controller类

    此文章是基于 搭建SpringMVC+Spring+Hibernate平台 功能:设置请求.响应对象:session.cookie操作:ajax访问返回json数据: 创建springMVC基础con ...

  4. hibernate基础dao类

    此文章是基于 搭建SpringMVC+Spring+Hibernate平台 功能:数据库的保存.更新.删除:sql.hql查询:分页查询:调用存储过程 创建hibernate基础dao类: BaseD ...

  5. [.net 面向对象编程基础] (9) 类和类的实例

    [.net 面向对象编程基础] (9) 类和类的实例 类 ,顾名思义就是分类.类别的意思.我们要面向对象编程,就需要对不同的事物进行分类.类可以说是.net面向对象的核心. 类:就是具有相同的属性和功 ...

  6. [.net 面向对象编程基础] (10) 类的成员(字段、属性、方法)

    [.net 面向对象编程基础] (10) 类的成员(字段.属性.方法) 前面定义的Person的类,里面的成员包括:字段.属性.方法.事件等,此外,前面说的嵌套类也是类的成员. a.类的成员为分:静态 ...

  7. python基础——枚举类

    python基础——枚举类 当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR = 3 ... NOV = 11 DEC = 12 好处是简单 ...

  8. python基础——定制类

    python基础——定制类 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的. __slots__我们已经知道怎么用了,__len__()方 ...

  9. Python基础-类的探讨(class)

    Python基础-类的探讨(class) 我们下面的探讨基于Python3,我实际测试使用的是Python3.2,Python3与Python2在类函数的类型上做了改变 1,类定义语法  Python ...

随机推荐

  1. ABP开发框架前后端开发系列---(14)基于Winform的ABP快速开发框架

    前面介绍了很多ABP系列的文章,一步一步的把我们日常开发中涉及到的Web API服务构建.登录日志和操作审计日志.字典管理模块.省份城市的信息维护.权限管理模块中的组织机构.用户.角色.权限.菜单等内 ...

  2. 墙上你APP设计与实现

    墙上你APP,听名字你们就应该可以想到是一个类似于表白墙吧,其实在做这个项目的时候我就是看到我们学校有一个专门工程墙,但是你找它发布消息表白或者找寻自己在学校掉了的饭卡或者身份证的时候,需要等它们同意 ...

  3. itextsharp操作pdf——插入图片、二维码等

    简单介绍 业务需求,需要往pdf图纸上添加二维码功能,将实现过程记录下来 下载类库 直接下载 添加引用 添加命名空间 using System.IO; using iTextSharp.text.pd ...

  4. ArcGIS Server10.4 service发布步骤

    准备内容 安装环境:win10*64位专业版 安装文件:ArcGIS_Server_Ent_Windows_1041_150998.iso 破解文件:Lic10.4.1.ecp #安装Server前, ...

  5. HTML中特殊符号编码对照表,html特殊符号编码都有哪些?

    HTML中一些无法打出来的符号可以用相应的代码进行代替显示,本文提供了一些HTML特殊符号相应的代码供开发者参考. 特殊符号 命名实体 十进制编码 特殊符号 命名实体 十进制编码 特殊符号 命名实体 ...

  6. fastadmin中js是如何调用的

    想要了解fastadmin中的js是怎么调用的,就应该先了解RequireJs. RequireJs是模块化工具,每一个我们自己的js文件或者库都可以看成是一个模块,按需引入.写法如下: <sc ...

  7. Fiddler应用——Fiddler过滤功能

    Fiddler的过滤功能在Fiddler右面板处,点击Filters显示如图所示面板. 如图所示,Fiddler的过滤面板主要分为几个部分: 1.Use Filters:是否启用过滤器 2.Actio ...

  8. JUC-0-JUC简介

    Java JUC  简介   在 Java 5.0 提供了 java.util.concurrent (简称 JUC )包,在此包中增加了在并发编程中很常用 的实用工具类,用于定义类似于线程的自定义子 ...

  9. 文件操作NIO

    在丑陋的 Java I/O 编程方式诞生多年以后,Java终于简化了文件读写的基本操作. 两个基本组件 文件或者目录的路径: 文件本身. 这块基本都是些记忆性的东西,没什么过多的需要写的地方,用的时候 ...

  10. 微信小程序支付功能讲解(2)

    小程序支付 业务流程时序图 官方文档 步骤: 1. Openid 在小程序初次加载的时候就已经获取(详情见 小程序登录) 2. 生成商户订单 1.商品信息由小程序端提供 2.提供支付统一下单接口所需参 ...