Movatterモバイル変換


[0]ホーム

URL:


  1. Веб-технологии для разработчиков
  2. JavaScript
  3. Справочник по JavaScript
  4. Выражения и операторы
  5. super

This page was translated from English by the community.Learn more and join the MDN Web Docs community.

View in EnglishAlways switch to English

super

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨март 2016 г.⁩.

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

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

Синтаксис

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

Описание

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

Пример

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

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

js
class Rectangle {  constructor(height, width) {    this.name = "Rectangle";    this.height = height;    this.width = width;  }  sayName() {    console.log("Hi, I am a ", this.name + ".");  }  get area() {    return this.height * this.width;  }  set area(value) {    this._area = value;  }}class Square extends Rectangle {  constructor(length) {    this.height; // ReferenceError, super должен быть вызван первым!    // Здесь вызывается конструктор родительского класса с длинами,    // указанными для ширины и высоты класса Rectangle    super(length, length);    // Примечание: в производных классах super() необходимо вызывать, прежде чем    // использовать 'this'. Если этого не сделать, произойдет ошибка ReferenceError.    this.name = "Square";  }}

Вызов статических методов через super

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

js
class Rectangle {  static logNbSides() {    return "У меня 4 стороны";  }}class Square extends Rectangle {  static logDescription() {    return super.logNbSides() + ", равные между собой";  }}Square.logDescription(); // 'У меня 4 стороны, равные между собой'

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

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

js
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 не может перезаписать значение свойства.

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

js
var obj1 = {  method1() {    console.log("method 1");  },};var obj2 = {  method2() {    super.method1();  },};Object.setPrototypeOf(obj2, obj1);obj2.method2(); // выведет "method 1"

Спецификации

Specification
ECMAScript® 2026 Language Specification
# sec-super-keyword

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

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

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp