JS【详解】类 class ( ES6 新增语法 )

avatar
作者
猴君
阅读量:2

本质上,类只是一种特殊的函数。

console.log(typeof 某类); //"function" 

声明类 class

方式 1 – 类声明

class Car {   constructor(model, year) {     this.model = model;     this.year = year;   } } 

方式 2 – 类表达式

匿名式

const Car = class {   constructor(model, year) {     this.model = model;     this.year = year;   } } 

命名式 —— 类名称在表达式定义的内部有效,在外部无法使用

const NamedCar = class Car {   constructor(model, year) {     this.model = model;     this.year = year;   }   getName() {     return Car.name;   } } const ford = new NamedCar(); console.log(ford.getName()); // Car console.log(ford.name); // 引用错误: name未定义 

构造函数 constructor

每个类只能存在一个,在构造器中可以通过super()方法来调用其父类的构造器。

类的属性(原型方法)

支持表达式命名,以下三种效果相同:

class CarOne {   driveCar() {} } class CarTwo {   ['drive' + 'Car']() {} } const methodName = 'driveCar'; class CarThree {   [methodName]() {} } 

类的修饰符

  • get 获取类的属性值
  • set 修改类的属性值
class Obj {     c="我是原生的a,只是需要在this.c暂时存储",          get a(){      return this.c        },          set a(val){         this.c=val     } }   const obj = new Obj() 

使用类 new

class Car {   constructor(model, year) {     this.model = model;     this.year = year;   } } const fiesta = new Car('Fiesta', '2010'); 

类的继承 extends

class Animal {   constructor(name) {     this.name = name;   }   speak() {     console.log(this.name + ' generic noise');   } } class Cat extends Animal {   speak() {     console.log(this.name + ' says Meow.');   } } class Lion extends Cat {   speak() {     super.speak();     console.log(this.name + ' Roars....');   } } var l = new Lion('Lenny'); l.speak(); //"Lenny says Meow." //"Lenny Roar...." 
  • 子类内通过 super 调用父类

在子类的构造器中,必须先调用super()方法才能正确地获取到this关键字

class Base {} class Derive extends Base {   constructor(name) {     this.name = name; //'this' 不允许在 super()之前   } } 

子类中,如果定义了构造器,则必须在其中调用super()方法,否则会报错

class Base {} class Derive extends Base {   constructor() { //在构造器中没有调用super()方法   } } 
  • 父类默认构造器
constructor(){} 
  • 子类默认构造器
constructor(...args){   super(...args); } 

多重继承

JavaScript本身不支持多重继承,在ES6中实现mixin的一种比较流行的实现方式是编写输入为父类输出为子类的函数,例如:

class Person {} const BackgroundCheck = Tools => class extends Tools {   check() {} }; const Onboard = Tools => class extends Tools {   printBadge() {} }; class Employee extends BackgroundCheck(Onboard(Person)) { } 

Employee类依次顺序继承了BackgroundCheck类、Onboard类和Person类。

类和普通函数的区别

  • 类必须先声明,再使用
var ford = new Car(); //引用错误 class Car {} 
  • 普通函数可用先使用,再声明
normalFunction();   //先使用 function normalFunction() {}  //后声明 

【面试题】手写 class

https://blog.csdn.net/weixin_41192489/article/details/139442546

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!