super

В процессе перевода.

Ключевое слово 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
    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, так что 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 Latest Draft (ECMA-262)
Определение 'super' в этой спецификации.
Черновик

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

Update compatibility data on GitHub
КомпьютерыМобильныеServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome для AndroidFirefox для AndroidOpera для AndroidSafari on iOSSamsung InternetNode.js
superChrome Полная поддержка 42Edge Полная поддержка 13Firefox Полная поддержка 45IE Нет поддержки НетOpera Полная поддержка 29Safari Полная поддержка 7WebView Android Полная поддержка 42Chrome Android Полная поддержка 42Firefox Android Полная поддержка 45Opera Android Полная поддержка 29Safari iOS Полная поддержка 7Samsung Internet Android Полная поддержка 4.0nodejs Полная поддержка Да

Легенда

Полная поддержка  
Полная поддержка
Нет поддержки  
Нет поддержки

Gecko specific notes

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

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