Невозможно использовать 'super' с функцией, определенной для объекта-прототипа в классе JavaScript - PullRequest
0 голосов
/ 26 марта 2019

У меня есть класс A, который является родителем класса B

class A {
    constructor(a){
        this.a=a;
    }

    par(){
        console.log("para");
    }
}

class B extends A {
    constructor(a) {
        super(a)
        this.a = "child";
    }

    par() {
        super.par();
        console.log("child");
    }
}

Когда я использую этот код, он отлично работает.

Но когда я явно определяю par функция B с использованием этого кода:

B.prototype.par = function() {
    super.par();
}

Я получаю сообщение об ошибке

Uncaught SyntaxError: ключевое слово 'super' неожиданно здесь

Создаем ли мы функцию в определении класса или в объекте-прототипе функции («класс»), это должно быть одно и то же.Что я тут не так делаю?

1 Ответ

1 голос
/ 26 марта 2019

'super' - это просто синтаксический сахар, введенный в ES2015 вместе с синтаксисом класса.Он может использоваться только в функциях класса (конструктора и методов), расширяющих другой класс.

class A {
  constructor(){}
  par(){ console.log('para') }
}

class B extends A {
  constructor(){
    super()
  }
}

Эквивалентно:

function A(){}
A.prototype.par = function(){console.log('para')}

var B = (function(parent){
  var _super = parent;
  function B(){
    _super.call(this); // calls parent's constructor
  }

  B.prototype = Object.create(_super.prototype); // Inherits parent's methods.

  B.prototype.par = function(){ // override parent's par.
    _super.prototype.par.call(this); // child still has access to parent's par method thanks to closure :)
    console.log('child');
  }

  return B;
})(A);

var b = new B();
b.par()

Вы не можете сделать:

function(){
  super // super is not defined...
}
...