无法对JavaScript类中的原型对象定义的函数使用'super'

时间:2019-03-26 06:33:45

标签: javascript class inheritance super

我有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();
}

我得到了错误

  

未捕获的SyntaxError:'super'关键字在此处意外

无论我们是在类定义中还是在function('class')的原型对象中创建函数,它都应该是同一件事。 我在这里做什么错了?

2 个答案:

答案 0 :(得分:1)

'super'只是在ES2015中引入的语法糖以及类语法。 它只能在扩展另一个类的'class'函数(构造函数和方法)中使用。

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...
}

答案 1 :(得分:-1)

它为我工作。我认为您的代码实现没有问题。除了下面的实例创建和方法调用之外,相同的代码没有更改

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

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");
  }
}

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