语法

基本语法

  1. class ClassName {
  2. constructor(){ //constructor不是必须的
  3. //声明类的变量的地方
  4. ...
  5. }
  6. //声明方法
  7. method1(){ ... }
  8. method2(){ ... }
  9. method3(){ ... }
  10. }

例子:

  1. class Animal {
  2. constructor(name){
  3. this.name = name
  4. }
  5. sayName(){
  6. console.log("名字叫做:", this.name)
  7. }
  8. }
  9. //使用
  10. const Dog = new Animal("旺财");
  11. Dog.sayName() //名字叫做: 旺财

:::info 代码风格:

  1. 声明类名的时候,第一个字母大写。 :::

getter/setter

用法:

  1. class Animal {
  2. constructor(name){
  3. this.name = name
  4. }
  5. //读取name的时候触发get方法
  6. get name(){
  7. return this._name
  8. }
  9. //赋值name的时候触发set方法
  10. set name(value){
  11. this._name = value
  12. console.log("set触发了")
  13. }
  14. }
  15. //使用
  16. let dog = new Animal("旺财") //set触发了
  17. Dog.name //get触发了

:::warning 坑:

  1. 上面例子,在get/set一个属性的时候,如果没有在get里返回值,那么人为的去读取操作(console.log)那个属性,会得到undefing :::

类继承

详见:js继承

类的静态属性与静态方法

new过程

上面的例子,当new一个对象时,就会创建一个名为Dog(取决于开发者想起什么名字)的新对象,constroctor对这个对象分配键值,对象的原型指向该类,因此可以直接调用这个类的方法。

调用类方法的这个过程就很像是Dog.prototype.sayName一样:

  1. function Animal(name){
  2. this.name = name
  3. }
  4. Animal.prototype.sayName = function(){
  5. console.log("名字叫做:", this.name)
  6. console.log(this.name)
  7. }
  8. //用法
  9. const Dog = new Animal("旺财")
  10. Dog.sayName() //名字叫做: 旺财
  11. Dog.sayName()

因为得到的结果与使用类的结果基本相同,因此可以说类是prototype的语法糖也不为过。

类的特点

  1. 与prototype不同,类会在创建函数的时候在内部标记[[IsClassConstructor]]: true,JS会检查该语法,必须使用new来调用。
  2. 类方法不可枚举。类默认将pototype的所有方法的enumerable标志设置为false(不明白这是什么请了解:属性标志和属性描述符
  3. 使用类,将会自动进入严格模式,即默认使用use strict