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ả classes và object 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