在 EcmaScript 6 中,我们将会拥有原生的类,而不是像现在通过原型链来实现。使用 TypeScript 我们能提前体验这一特性。

首先来看看一个简单的例子:

class Greeter {greeting: string;constructor(message: string) {this.greeting = message;}greet() {return "Hello, " + this.greeting;}
}var greeter = new Greeter("world");

我们使用 class 关键字来定义了,使用 constructor 来定义构造函数,使用 this 关键字来指代当前对象。

除了构造函数关键字外,语法跟 C# 和 java 是比较像的。

  • 继承

作为面向对象三大基本特征之一,TypeScript 当然支持继承。

class Animal {name:string;constructor(theName: string) { this.name = theName; }move(meters: number = 0) {alert(this.name + " moved " + meters + "m.");}
}class Snake extends Animal {constructor(name: string) { super(name); }move(meters = 5) {alert("Slithering...");super.move(meters);}
}class Horse extends Animal {constructor(name: string) { super(name); }move(meters = 45) {alert("Galloping...");super.move(meters);}
}var sam = new Snake("Sammy the Python");
var tom: Animal = new Horse("Tommy the Palomino");sam.move();
tom.move(34);

跟接口的继承一样,都是使用 extends 关键字来继承。在子类中,我们使用 super 关键字来访问父类。在上面代码中我们看到方法的参数中有等于号,这表示方法参数的默认值。如果我们调用该方法时,不写该参数或者传入 undefined,那么这个参数就会被赋予默认值。

sam.move();
sam.move(undefined);

即上面这两段代码是等价的。

注意:TypeScript 跟 C# 和 java 一样,是不支持多继承的(虽然可以通过原型链实现)。

  • 访问修饰符

在 TypeScript 中,现在仅有两种访问修饰符,分别是 public 和 private。

在之前的代码中,我们都能够正常访问到类中定义的属性。那么可见,类的属性默认的访问修饰符是 public 的。

class Animal {private name:string;constructor(theName: string) { this.name = theName; }
}class Rhino extends Animal {constructor() { super("Rhino"); }
}class Employee {private name:string;constructor(theName: string) { this.name = theName; }
}var animal = new Animal("Goat");
var rhino = new Rhino();
var employee = new Employee("Bob");animal = rhino;
animal = employee; //error: Animal and Employee are not compatible

我们将之前的代码中的属性的访问修饰符修改为 private 之后,就会发现编译无法通过了。

  • 参数属性

访问修饰符不仅仅可以作用于属性,还能作用于构造函数参数。这个是 TypeScript 中的一个语法糖。

class Animal {constructor(private name: string) { }move(meters: number) {alert(this.name + " moved " + meters + "m.");}
}

那么构造函数中的 name 参数将会生成一个 private 的属性。

访问器

有时候我们在设置属性的时候,希望对输入进行检查,这时候就需要用到访问器了。

var passcode = "secret passcode";class Employee {private _fullName: string;get fullName(): string {return this._fullName;}set fullName(newName: string) {if (passcode && passcode == "secret passcode") {this._fullName = newName;}else {alert("Error: Unauthorized update of employee!");}}
}var employee = new Employee();
employee.fullName = "Bob Smith";
if (employee.fullName) {alert(employee.fullName);
}

上面我们就为 fullName 属性定义了 get 和 set 访问器了。

  • 静态属性

在前面,我们定义的都是实例属性。那么如何定义静态属性呢?使用 static 关键字就可以了。

class Grid {static origin = {x: 0, y: 0};calculateDistanceFromOrigin(point: {x: number; y: number;}) {var xDist = (point.x - Grid.origin.x);var yDist = (point.y - Grid.origin.y);return Math.sqrt(xDist * xDist + yDist * yDist) / this.scale;}constructor (public scale: number) { }
}var grid1 = new Grid(1.0);  // 1x scale
var grid2 = new Grid(5.0);  // 5x scale

alert(grid1.calculateDistanceFromOrigin({x: 10, y: 10}));
alert(grid2.calculateDistanceFromOrigin({x: 10, y: 10}));

注意的是,要访问静态属性,必须加上该静态属性所在的类作为前缀。

另外,静态属性也能配合访问修饰符使用。

class Test {private static _age: number;static get age(): number {return Test._age;}static set age(value: number) {Test._age = value;}
}

转载于:https://www.cnblogs.com/h82258652/p/4589941.html

【TypeScript】TypeScript 学习 3——类相关推荐

  1. TypeScript 的学习笔记

    文章目录 1.`TypeScript` 简介 1.1.什么是 `TypeScript` 1.2.为什么要使用 `TypeScript` 2.安装 `TypeScript` 2.1.使用 `tsc` 命 ...

  2. TypeScript入门教程 之 类/抽象类/构造器/Getter/Setter

    TypeScript入门教程 之 类/抽象类/构造器/Getter/Setter 将JavaScript中的类作为头等项很重要的原因是: 类提供了有用的结构抽象 为开发人员提供一种一致的方式来使用类, ...

  3. typeScript类型学习

    typeScript类型学习 1. 字面量 1.1 什么是字面量 1.2 为什么要有字面量 1.3 ts中的字面量 2.|(联合类型) 3.any 4.unknown 5.unknown和any的区别 ...

  4. 如何学习streamdecoder类_如何学习篇5:强化2种能力——2种学习模式之运动类:隐性学习...

    [本文摘要] [注]本文所述内容为学习Yjango<学习观>相关视频之后的总结,观点归Yjango所有,本文仅作为学习之用. 阅读本节,会让你对英语这类运动类知识的学习豁然开朗,你会知道英 ...

  5. java中蛇的属性有哪些_学习Java类的属性

    学习Java类的属性-武汉北大青鸟 Public.private.protected显示了三种类中的属性和服务的类型,public是可以随意访问的.private是外界不能访问的(显示了数据的封装性) ...

  6. 普通话测试软件测分准吗,普通话学习测试类 | 普通话测试APP,能做到测试、学习提高两不误吗?...

    原标题:普通话学习测试类 | 普通话测试APP,能做到测试.学习提高两不误吗? 普通话是如今人们生活的常用语言,但要说到参加普通话测试,如果没有提前了解普通话测试的形式与要求,也不知道自己普通话的起步 ...

  7. 学信息安全买计算机,大学学习计算机类信息安全方向真的很蠢吗?

    大学学习计算机类信息安全方向真的很蠢吗? 本人2018届高考党,目前水平可以上一个不错的211,望借自主招生冲击985院校. 几天前,当我对老师说:"我目前最优先的选择是计算机-信息安全方向 ...

  8. java虚拟机预先加载哪些类_Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

  9. Java为枚举类创建成员变量_Java学习——枚举类

    Java学习--枚举类 摘要:本文主要介绍了Java的枚举类. 部分内容来自以下博客: https://www.cnblogs.com/sister/p/4700702.html https://bl ...

  10. 2020-用多通道卷积神经网络学习单类特征用于人脸表现攻击检测

    2020年,Anjith George等人,期刊:TIFS,CCFA刊,Learning One Class Representations for Face Presentation Attack ...

最新文章

  1. 简单读懂微生物基因组的泛基因组学
  2. SAP MM 预留单据里的Base date和Requirement date
  3. 不要相信修改注册表EnablePrefetcher文件达到加速开机速度的说法
  4. Linux 问题分析,性能优化
  5. Android如何使用API
  6. C语言解决汉诺塔问题
  7. UVa11882,Biggest Number
  8. 【转】C++ 存储类
  9. 西安电子科技大学研究生计算机专业王宇平教授学生就业岗位,西安电子科技大学计算机学院导师信息情况...
  10. linux 让暂停的进程恢复,Linux 下进程的挂起和恢复命令
  11. C语言小知识---奇葩的小数
  12. 计算机图形学(一) 视频显示设备_3_随机扫描显示器
  13. Hive报错:Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
  14. mysql日期为00_MySQL 8.0.13设置日期为0000-00-00 00:00:00时出现的问题解决
  15. 树莓派USB摄像头和motion实现网络监控
  16. Ubuntu安装字体
  17. 离散数学1-数理逻辑的基本概念
  18. 企业邮箱用户名如何设置修改?企业邮箱域名后缀选择
  19. 中国艺术孙溟㠭书法《觉》
  20. 网络天才网页中文版_akinator中文版在线玩

热门文章

  1. rpt水晶报表制作过程
  2. HDU ACM 1224 Free DIY Tour (SPFA)
  3. 在LINUX下安装 Sybase ASE 11.0.3.3
  4. 网友的VOIP总结 1
  5. linux 进程0 写时复制,linux 写时复制 COW 过程梳理
  6. 发邮件请领导审批文件怎么说_住建部:1月1日起,两项甲级资质实行告知承诺审批!...
  7. python自动化办公 51cto_聊聊 Python 办公自动化之一 Excel
  8. Zookeeper权限控制ACL详解
  9. python 工程生成requirements
  10. 3-25Pytorch与张量填充3-26Pytorch与傅里叶变化