javascript类(class)

2022-02-26 16:16:31 浏览数 (1)

es6后 js 也支持了类, js的类本质其实就是原型链的语法糖,相对于 javaScript, typeScript的类要比 javaScript 类强大很多.
  • 类声明 javascript中使用类 class Person { constructor(name, age: number) { this.name = name } sayName() { console.log(`my name is ${this.name}`) } } 以上类在typeScript中使用如下 class Person { name: string // 此处必须声明 constructor(name: string, age: number) { this.name = name this.age = age } sayName() { console.log(`my name is ${this.name}`) } }
  • 继承(extends) class Staff extends Person { // 派生类的构造函数必须包含 "super" 调用 constructor(name: string, age: number) { super(name, age) } job(kind: string): void { console.log(`我是${kind}`) } } const xiaohong = new Staff('xiaohong', 20) console.log(xiaohong.name) // 小红 xiaohong.job('coder') // 我是 coder
  • 静态属性 静态属性指的是 Class 本身的属性,即Class.propName,而不是定义在实例对象(this)上的属性
  • es6

class Person {} Person.propName = 'person'

  • ts

// 比较简洁, 直接通过关键字 static 就可以 class Person { static propName: string = 'person' } console.log(Person.propName)

  • 公共属性
  • es6中 class类代码块内所有的属性方法不经过其他操作的话都是公共的, 是对外可见的
  • ts 公共属性通过关键字 public 声明 如果属性或方法没有声明public, ts 解析时默认会认为是 public
  • 私有属性(private) 只能在类的内部被访问
  • es6 还在提案中,可以通过属性或方法名前加#限制访问.(想使用的话修改 babel 的支持的上限)
  • ts

class Person { private sex: string name: string age: number constructor(name: string, age: number, sex: string) { this.name = name this.age = age this.sex = sex } } const xiaohong = new Person('xiaohong', 20, '男') console.log(xiaohong.sex) // 属性“sex”为私有属性,只能在类“Person”中访问。ts(2341) // 派生类 class Staff extends Person { company: string constructor(name: string, age: number, sex: string, company: string) { super(name, age, sex) this.company = company } getSex() { return this.sex // 属性“sex”为私有属性,只能在类“Person”中访问。ts(2341) } }

  • 受保护的(protected) protected修饰符与 private修饰符的行为很相似,但有一点不同, protected成员在派生类中仍然可以访问, 以上的例子将 private 改成 protected 可以修复报错
  • 抽象类(abstract) 抽象类做为其它派生类的基类使用, 不可以实例化.abstract申明的属性方法一定要在派生类中实现. 与接口的区别是, 抽象类可以包含成员的实现细节. 让我们将上面的例子 Person 加上 abstract 会发生什么 abstract class Person { abstract sex: string name: string age: number constructor(name: string, age: number) { this.name = name this.age = age // this.sex = sex // 不能在构造函数中访问类“Person”中的抽象属性“sex”。 } // 抽象方法 不可以实现方法,只需定义类型即可 abstract sayName(): void } // const xiaohong = new Person('xiaohong', 20, '男') // 无法创建抽象类的实例。 // 派生类 class Staff extends Person { // 非抽象类“Staff”不会实现继承自“Person”类的抽象成员“sex”。 company: string // sex: string constructor(name: string, age: number, sex: string, company: string) { super(name, age) this.company = company // this.sex = sex } // 基类上abstract声明的属性或方法一定要在派生类中实现 sayName() { console.log(`my name is ${this.name}`) }

0 人点赞