Можно ли перевести наследование классов ES6 в эквивалентный код ES5? - PullRequest
0 голосов
/ 11 января 2020

Этот ответ показывает, как простой класс ES6:

class A {
  constructor() {
    this.foo = 42;
  }

  bar() {
    console.log(this.foo);
  }
}

эквивалентен следующему коду ES5:

function A() {
  this.foo = 42;
}

A.prototype.bar = function() {
  console.log(this.foo);
}

Аналогично возможно перевести ES6 наследование классов к коду ES5? Что будет ES5 эквивалентным следующему производному классу?

class B extends A {
  constructor() {
    super();
    this.foo2 = 12;
  }

  bar() {
    console.log(this.foo + this.foo2);
  }

  baz() {
    console.log(this.foo - this.foo2);
  }
}

1 Ответ

5 голосов
/ 11 января 2020

Эквивалент в том смысле, как это было сделано ранее (без учета точного поведения, такого как перечисление свойств и расширение реальных классов ES6 из ES5-совместимого кода), было:

  • установить дочерний прототип на новый объект, наследующий родительский прототип
  • , вызывает родительский конструктор из дочернего конструктора
function B() {
  A.call(this);
  this.foo2 = 12;
}

B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;

B.prototype.bar = function () {
  console.log(this.foo + this.foo2);
};

B.prototype.baz = function () {
  console.log(this.foo - this.foo2);
};

Также было возможно наследовать свойства конструктора («статические»), используя Фактическая возможность модификации существующих прототипов: B.__proto__ = A

...