【TypeScript】类 [ 编程杂谈 ]
大数据男孩 文章 正文
明妃
{{nature("2022-08-14 17:23:20")}}更新说明
对于传统
的 JavaScript 程序
我们会使用函数
和基于原型的继承
来创建可重用
的组件,但对于熟悉使用面向对象方式
的程序员使用这些语法
就有些棘手
,因为他们用的是基于类的继承并且对象是由类构建出来的。 从 ECMAScript 2015,也就是 ES6 开始
,JavaScript 程序员
将能够使用 基于类
的面向对象
的方式。 使用 TypeScript,我们允许开发者现在就使用这些特性,并且编译后的 JavaScript 可以在所有主流浏览器和平台上运行,而不需要等到下个 JavaScript 版本。
类 的 结构
类的主要元素:
属性
、构造器
、方法
class Cat {
// 属性
name: string
age: number
// 构造函数
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
// 普通方法
eat(): void {
console.log(`${this.name} 吃玉米`)
}
}
let cat: Cat = new Cat('O_O', 12);
cat.eat()
继承 & 多态
关键字
extends
class Animal {
// 属性
name: string
age: number
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
run(distance: number): void {
console.log(`Animal run ${distance}m`)
}
}
class Cat extends Animal { // 继承
type: string
// 构造函数
constructor(name: string, age: number) {
super(name, age) // 调用父类构造函数
}
// 普通方法
eat(): void {
console.log(`${this.name} 吃玉米`)
}
// 重写父类方法
run(distance: number): void {
console.log(`${this.name} run ${distance}m`)
}
}
let cat: Cat = new Cat('O_O', 12);
cat.run(15)
权限修饰符
默认 公共
public
,实例对象,类内部,子类 都可以访问私有
private
,只有类内部
可以访问保护
protected
,类内部
、子类
之类可以访问
class Animal {
// 属性
protected name: string // 当前类内部 子类
public age: number // 公共
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
run(distance: number): void {
console.log(`Animal run ${distance}m`)
}
}
class Cat extends Animal { // 继承
private type: string // 当前类内部
// 构造函数
constructor(name: string, age: number) {
super(name, age) // 调用父类构造函数
}
// 普通方法
eat(): void {
console.log(`${this.name} 吃玉米`)
}
// 重写父类方法
run(distance: number): void {
console.log(`${this.name} run ${distance}m`)
}
}
let cat: Cat = new Cat('O_O', 12);
cat.run(15)
console.log(cat.age) // 12
readonly 修饰符
readonly
修饰属性为可读
,只能在定义时
或者构造函数
初始化
class Person {
readonly name: string = 'abc'
constructor(name: string) {
this.name = name
}
}
let john = new Person('John')
参数属性
TypeScript
不一样的地方,作用简化代码
不止能写 readonly
,其他权限 public
,private
,protected
也能写
// 与上一个代码效果一样
class Person {
constructor(readonly name: string) {
}
}
let john = new Person('John')
静态属性
不用实例化
就能获取的属性
class Dog {
static name_: string = 'O_O'
}
console.log(Dog.name_) // 'O_O'
抽象类
抽象类
和抽象方法
用abstract
关键字
抽象类
作为其它类
继承
使用。抽象类
不能
被实例化
。- 不同于接口,
抽象类
的普通方法
可以有方法体
,但抽象方法
不能
有方法体
抽象方法 必须 在抽象类里
abstract class Animal {
abstract eat(): void; // 抽象方法 没有实现细节
run(x: number){ // 继承后 普通方法 可以不用实现
console.log(`xx run ${x}m`)
}
}
class Dog extends Animal{
eat(){ // 必须实现 全部 抽象方法的方法体
console.log(`dog eat xx`)
}
}
let dog: Dog = new Dog()
dog.run(15) // xx run 15m
{{nature('2020-01-02 16:47:07')}} {{format('12641')}}人已阅读
{{nature('2019-12-11 20:43:10')}} {{format('9527')}}人已阅读
{{nature('2019-12-26 17:20:52')}} {{format('7573')}}人已阅读
{{nature('2019-12-26 16:03:55')}} {{format('5017')}}人已阅读
目录
标签云
一言
评论 0
{{userInfo.data?.nickname}}
{{userInfo.data?.email}}