欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

es6中的类

程序员文章站 2022-07-16 22:05:14
...

ES6 中的类实际上就是个函数,而且正如函数的定义方式有函数声明和函数表达式两种一样,类的定义方式也有两种,分别是:类声明、类表达式。

类声明是定义类的一种方式,就像下面例子这样,使用关键字class后跟一个类名(这里是 person),就可以定义一个类了

eg:
class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}

类声明函数声明不同的一点是,函数声明存在变量提升,而类声明不会。

也就是说,你需要先声明这个类,然后才能使用它,否则代码会抛出 ReferenceError 异常。

像下面这样:

var p = new Person(); // ReferenceError错误
 
class Person {}

正确:


class Person {
  constructor(name) {
    this.name = name;
  }
}
var p = new Person("xiaowang"); 
p.age=29;
p.sayName=function(){
  console.log('My name is'+this.name) }类表达式

类表达式是定义类的另外一种方式,就像函数表达式一样,在类表达式中,类名是可有可无的。

如果定义了类名,则该类名只有在类体内部才能访问到。(类的成员需要定义在一对{} 里,{}里的代码和其本身就组成了类体

// 匿名类表达式
var Person = class {
  constructor(name) {
    this.name= name;
  }
};
 
// 命名类表达式
var Person = class Person
 {
  constructor(name) {
    this.name = name;
  }
};

注意: 类表达式和类声明一样也不会有提升的现象。

  


构造函数(找时间在仔细总结一份构造函数的文章)

类的成员需要定义在一对{} 里,{}里的代码和其本身就组成了类体

类成员包括类构造器和类方法(包括静态方法和实例方法)。

  class 根据 constructor 方法来创建和初始化对象。

  constructor方法是类的默认方法=>当你通过new命令生成对象实例时,就会自动调用该方法。

注意*一个类只能有一个constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。

constructor() {}
constructor方法默认返回实例对象(即this),完全可以指定返回另外一个对象。

class Foo {
  constructor() {
    return Object.create(null);
  }
}

var foo =new Foo();

foo instanceof Foo  // false

[instanceof运算符可以用来判断某个构造函数的prototype属性是否存在于另外一个要检测对象的原型链上。 ]

上面代码中,constructor函数返回一个全新的对象,结果导致实例对象foo不是Foo类的实例。

  constructor 方法是一个特殊的类方法,它既不是静态方法也不是实例方法,它仅在实例化一个类的时候被调用。一个类只能拥有一个名为 constructor 的方法,否则会抛出 SyntaxError 异常。


使用 extends 关键字创建子类


extends 关键字可以用来创建继承于某个类的子类。

这个例子是根据名为Animal类创建一个名为Dog的类。

class Animal { 
  constructor(name) {
    this.name = name;
  }
 
  speak() {
    console.log(this.name + ' makes a noise.');
  }
}
 
class Dog extends Animal {
  speak() {
    console.log(this.name + ' barks.');
  }
}
var dog = new Dog('NiNi');
dog.speak();