Этот перевод не завершён. Пожалуйста, помогите перевести эту статью с английского
Ключевое слово 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 (ECMA-262) Определение 'super' в этой спецификации. |
Живой стандарт |
Совместимость в браузерах
| Компьютеры | Мобильные | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
super | Chrome Полная поддержка 42 | Edge Полная поддержка 13 | Firefox Полная поддержка 45 | IE Нет поддержки Нет | Opera Полная поддержка 29 | Safari Полная поддержка 7 | WebView Android Полная поддержка 42 | Chrome Android Полная поддержка 42 | Firefox Android Полная поддержка 45 | Opera Android Полная поддержка 29 | Safari iOS Полная поддержка 7 | Samsung Internet Android Полная поддержка 4.0 | nodejs Полная поддержка 6.0.0 |
Легенда
- Полная поддержка
- Полная поддержка
- Нет поддержки
- Нет поддержки
Gecko specific notes
super()does not yet work as expected for built-in prototypes.