MDN’s new design is in Beta! A sneak peek: https://blog.mozilla.org/opendesign/mdns-new-design-beta/

Перевод не завершен. Пожалуйста, помогите перевести эту статью с английского.

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

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

Синтаксис

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

Описание

При использывании конструктора, ключевое слово super появляется само и должно быть использованно до того как ключевое слово this может использоваться. Это ключевое слово так же может быть использованно для вызова родительского объекта.

Пример

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

Этот фрагмент кода взят из classes sample (live demo).

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

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

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

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

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

class Human {
  constructor() {}
  static ping() {
    return 'ping';
  }
}

class Computer extends Human {
  constructor() {}
  static pingpong() {
    return super.ping() + ' pong';
  }
}
Computer.pingpong(); // 'ping pong'

Удаление свойств super

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

class Base {
  constructor() {}
  foo() {}
}
class Derived {
  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
    });
  } 
  f() { 
    super.prop = 2;
  }
}

var x = new X();
x.f();
console.log(x.prop); // 1

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

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

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

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

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

Specifications

Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'super' в этой спецификации.
Стандарт Initial definition.
ECMAScript Latest Draft (ECMA-262)
Определение 'super' в этой спецификации.
Черновик  

Browser compatibility

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 42.0 Nightly build ? ? ?
Feature Android Android Webview Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile Chrome for Android
Basic support ? 42.0 Nightly build ? ? ? 42.0

Gecko specific notes

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

See also

Метки документа и участники

 Внесли вклад в эту страницу: sgrogov, adamgrey28, loki2d, spmpl, uleming
 Обновлялась последний раз: sgrogov,