We're looking for a user researcher to understand the needs of developers and designers. Is this you or someone you know? Check out the post: https://mzl.la/2IGzdXS

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

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

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

Синтаксис

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

Описание

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

Пример

Использование 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 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
    });
  } 
  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

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

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

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

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