В процессе перевода.
Ключевое слово 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 2017 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.