MDN wants to learn about developers like you: https://qsurvey.mozilla.com/s3/MDN-dev-survey

This translation is incomplete. Please help translate this article from English.

Từ khóa super được sử dụng để gọi các hàm trên đối tượng cha.

Các biểu thức super.prop và super[expr] là hợp lệ trong mọi định nghĩa phương thức ở cả classesobject literals.

Cú pháp

super([arguments]); // gọi hàm khởi tạo cha.
super.functionOnParent([arguments]);

Mô tả

Khi được sử dụng trong một hàm khởi tạo, từ khóa super xuất hiện một mình và phải được sử dụng trước khi từ khóa this có thể sử dụng. Từ khóa này cũng có thể được sử dụng để gọi các hàm trên đối tượng cha.

Ví dụ

Sử dụng super trong classes

Đoạn code này lấy từ ví dụ về class (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 needs to be called first!
    
    // Here, it calls the parent class' constructor with lengths
    // provided for the Polygon's width and height
    super(length, length);
    
    // Note: In derived classes, super() must be called before you
    // can use 'this'. Leaving this out will cause a reference error.
    this.name = 'Square';
  }

  get area() {
    return this.height * this.width;
  }

  set area(value) {
    this.area = value;
  } 
}

Gọi super trên các phương thức tĩnh

Bạn cũng có thể gọi super trên các phương thức tĩnh.

class Human {
  constructor() {}
  static ping() {
    return 'ping';
  }
}

class Computer extends Human {
  constructor() {}
  static pingpong() {
    return super.ping() + ' pong';
  }
}
Computer.pingpong(); // 'ping pong'

Xóa các thuộc tính của super sẽ gây ra lỗi

Bạn không thể sử dụng thao tác delete và super.prop hoặc super[expr] để xóa một thuộc tính của lớp cha, nó sẽ ném lỗi ReferenceError.

class Base {
  constructor() {}
  foo() {}
}
class Derived extends Base {
  constructor() {}
  delete() {
    delete super.foo;
  }
}

new Derived().delete(); // ReferenceError: invalid delete involving 'super'. 

Super.prop không thể ghi đè các thuộc tính non-writable

Khi định nghĩa các thuộc tính non-writable ví dụ Object.defineProperty, super không thể ghi đè giá trị của thuộc tính này.

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

Sử dụng super.prop trong object literals

Super cũng có thể được sử dụng trong khởi tạo đối tượng hoặc literal. Trong ví dụ này, 2 đối tượng định nghĩa một phương thức. Trong đối tượng thứ hai, super gọi phương thức của đối tượng thứ nhất. Điều này làm được với sự trợ giúp của Object.setPrototypeOf() cái giúp chúng ta có thể thiết lập prototype của obj2 thành obj1, vì thế super có thể tìm method1 trên obj1.

var obj1 = {
  method1() {
    console.log("method 1");
  }
}

var obj2 = {
  method2() {
   super.method1();
  }
}

Object.setPrototypeOf(obj2, obj1);
obj2.method2(); // logs "method 1"

Thông số kỹ thuật

Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'super' in that specification.
Standard Initial definition.
ECMAScript 2017 Draft (ECMA-262)
The definition of 'super' in that specification.
Draft  

Khả năng tương thích của các trình duyệt

 
Tính năng Chrome Firefox (Gecko) Internet Explorer Opera Safari
Hỗ trợ cơ bản 42.0 45 (45) ? ? ?
Tính năng Android Android Webview Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile Chrome for Android
Hỗ trợ cơ bản ? 42.0 45.0 (45) ? ? ? 42.0

Lưu ý cho Gecko

  • super() chưa làm việc như mong đợi cho việc xây dựng trong các nguyên mẫu

Xem thêm

Document Tags and Contributors

 Contributors to this page: thanhvk
 Last updated by: thanhvk,