super

Ключевое слово super используется для вызова функций, принадлежащих родителю объекта.

Выражения: super.prop и super[expr] - действительны в любом методе определения в обоих классах и в литералах объекта.

Синтаксис

super([arguments]); // вызов родительского конструктора.
super.functionOnParent([arguments]);

Описание

В конструкторе ключевое слово super() используется как функция, вызывающая родительский конструктор. Её необходимо вызвать до первого обращения к ключевому слову this в теле конструктора. Ключевое слово super также может быть использовано для вызова функций родительского объекта.

Пример

Использование super в классах

Этот фрагмент кода взят из classes sample (live demo). В этом примере super() вызывается , чтобы предотвратить использования одинакового для классов Rectangle and Square определения тела конструктора.

class Polygon {
  constructor(height, width) {
    this.name = 'Polygon';
    this.height = height;
    this.width = width;
  }
  sayName() {
    console.log('Hi, I am a ', this.name + '.');
  }
}

class Square extends Polygon {
  constructor(length) {
    this.height; // ReferenceError, super должен быть вызван первым!

    // Здесь, вызывается метод конструктора родительского класса с длинами,
    // указанными для ширины и высоты класса Polygon
    super(length, length);

    // Примечание: в производных классах, super() необходимо вызывать прежде чем
    // использовать 'this'. Если этого не сделать будет сообщение об ошибке ссылки.
    this.name = 'Square';
  }

  get area() {
    return this.height * this.width;
  }

  set area(value) {
    this.area = value;
  }
}

Супер-вызовы статических методов

Вы так же можете вызывать super на статических методах.

class Rectangle {
  constructor() {}
  static logNbSides() {
    return 'У меня 4 стороны,';
  }
}

class Square extends Rectangle {
  constructor() {}
  static logDescription() {
    return super.logNbSides() + ' которые все равны';
  }
}
Square.logDescription(); // 'У меня 4 стороны, которые все равны'

Удаление свойств super вызывает ошибку

Вы не можете использовать delete operator и super.prop или super[expr] при удалении родительского класса он выдаст:ReferenceError.

class Base {
  constructor() {}
  foo() {}
}
class Derived extends Base {
  constructor() {}
  delete() {
    delete super.foo; // это плохо
  }
}

new Derived().delete(); // ReferenceError: invalid delete involving 'super'. 

super.prop не может переопределять свойства, защищённые от записи

При определении незаписываемых свойств с помощью, например, Object.defineProperty, super не может перезаписать значение свойства.

class X {
  constructor() {
    Object.defineProperty(this, 'prop', {
      configurable: true,
      writable: false,
      value: 1
    });
  }
}

class Y extends X {
  constructor() {
    super();
  }
  foo() {
    super.prop = 2;   // Не возможно перезаписать значение.
  }
}

var y = new Y();
y.foo(); // TypeError: "prop" доступен только для чтения
console.log(y.prop); // 1

Использование super.prop в объектных литералах

Super также можно использовать в объекте инициализатора / литерала. В этом примере, два объекта определяют метод. Во втором объекте, super вызывает первый метод объекта. Это работает с помощью Object.setPrototypeOf(), с которой мы можем установить прототип для obj2 в obj1, так что super может найти method1 в obj1.

var obj1 = {
  method1() {
    console.log("method 1");
  }
}

var obj2 = {
  method2() {
   super.method1();
  }
}

Object.setPrototypeOf(obj2, obj1);
obj2.method2(); // logs "method 1"

Характеристики

Характеристики Статус Комментарий
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'super' в этой спецификации.
Стандарт Initial definition.
ECMAScript (ECMA-262)
Определение 'super' в этой спецификации.
Живой стандарт

Совместимость в браузерах

BCD tables only load in the browser

Gecko specific notes

  • super() does not yet work as expected for built-in prototypes.

Смотрите также