如何使用 call() 进行继承。错误:没有“new”就不能调用类构造函数

Mac*_*ski 5 javascript constructor ecmascript-6

你能解释一下在使用时如何实现继承class吗?

当我function用于定义构造函数时,一切正常(参见代码版本 1)。但是当我变成functionES2015 class(版本 2)时,它会产生这个错误:

未捕获的类型错误:类构造函数 Person 不能在没有“new”的情况下被调用

我需要在代码中添加一些东西还是应该保持原样function

1. 工作代码使用 function

function Person(firstName, lastName) {
  this.firstName = firstName;
  this.lastName = lastName;
}

function Customer(firstName, lastName, phone, membership) {
  Person.call(this, firstName, lastName);
  this.phone = phone;
  this.membership = membership;
}

const customer1 = new Customer("Tom", "Smith", "555-555-555", "Standard");
console.log(customer1);
Run Code Online (Sandbox Code Playgroud)

2. 使用失败的代码 class

class Person {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
}

class Customer {
  constructor(firstName, lastName, phone, membership) {
    Person.call(this, firstName, lastName); // <--- TypeError
    this.phone = phone;
    this.membership = membership;
  }
}

const cust1 = new Customer("Bob", "Johnes", "555-222-333", "Silver");
console.log(cust1);
Run Code Online (Sandbox Code Playgroud)

tri*_*cot 5

事实上,Person.call()当用Person定义时是不允许的class。ES2015 提供了extendssuper关键字来实现这样的原型链定义:

class Customer extends Person {
  constructor(firstName, lastName, phone, membership) {
    super(firstName, lastName);
    this.phone = phone;
    this.membership = membership;
  }
}
Run Code Online (Sandbox Code Playgroud)