super 关键字用于调用一个对象的父对象上的函数。

super.prop 和 super[expr] 表达式在 和 对象字面量 任何 方法定义 中都是有效的。

语法

super([arguments]); 
// 调用 父对象/父类 的构造函数

super.functionOnParent([arguments]); 
// 调用 父对象/父类 上的方法

描述

在构造函数中使用时,super关键字单独出现,必须在可以使用this关键字之前使用。此关键字也可用于调用父对象上的函数。

例子

以下代码片段来自于 classes sample (演示).

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 需要先被调用!
    
/*
   这里,它调用父类的构造函数的 length, 
   作为Polygon 的 width和 height.
*/ 
    super(length, length);
    
/*
    注意: 在派生的类中, 在你可以使用'this'之前, 必须先调用super()。
    忽略这, 这将导致引用错误。
*/
    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 操作符 加 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 也可以在object initializer / literal 符号中使用。

 在下面的例子中,两个对象各定义了一个方法。在第二个对象中, 我们使用 super 调用了第一个对象中的方法。 当然,这需要我们先利用 Object.setPrototypeOf() 将第二个对象的原型设为第一个对象, 然后才能够使用 super  调用到对象1上的method1.

 

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
Standard Initial definition.
ECMAScript Latest Draft (ECMA-262)
super
Living Standard  

浏览器兼容性

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 42.0 45 (45) ? ? ?
Feature Android Android Webview Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile Chrome for Android
Basic support ? 42.0 45.0 (45) ? ? ? 42.0

Gecko 规范说明

  • super() 在内建原型上不能按照预期表现.

相关链接

文档标签和贡献者

标签: 
 此页面的贡献者: xgqfrms-GitHub, lvjs, saintwinkle
 最后编辑者: xgqfrms-GitHub,