你也可以使用super.getArea()方法来调用基类中的同名方法
class Square extends Rectangle { constructor(length) { super(length, length); } getArea() { return super.getArea(); } } 继承静态成员如果基类包含静态成员,那么这些静态成员在派生类中也是可用的。
class Rectangle { constructor(length, width) { this.length = length; this.width = width; } getArea() { return this.length * this.width; } static create(length, width) { return new Rectangle(length, width); } } class Square extends Rectangle { constructor(length) { super(length, length); } } let sqr = Square.create(10, 10); console.log(sqr.getArea());//100 从表达式中派生类在ES6中派生类的最强大能力,或许就是能够从表达式中派生类。只要一个表达式能够返回一个具有[[Constructor]]属性以及原型的函数,你就可以对其使用extends。
function Rectangle(length,width){ this.length = length; this.width = width; } Rectangle.prototype.getArea = function(){ return this.length * this.width; } class Square extends Rectangle{ constructor(length){ super(length,length); } } let x = new Square(10); console.log(x.getArea());//100extends后面能接受任意类型的表达式,这带来了巨大的可能性,例如动态的决定要继承的类。
function Rectangle(length, width) { this.length = length; this.width = width; } Rectangle.prototype.getArea = function () { return this.length * this.width; } function getBase() { return Rectangle; } class Square extends getBase() { constructor(length) { super(length, length); } } let x = new Square(10); console.log(x.getArea());任意表达式都能在extends关键字后使用,但并非所有表达式的结果都是一个有效的类。
null
生成器函数
继承内置对象在ES6类的继承中,this的值会先被基类创建,随后才被派生类的构造器所修改。结果是this初始就拥有作为基类的内置对象的所有功能,并能正确的接收与之关联的所有功能。
class MyArray extends Array { } let arr = new MyArray(); arr[0] = 'red'; console.log(arr.length); arr.length = 0; console.log(arr[0]); Symbol.species属性继承内置对象的一个有趣方面是:任意能返回内置对象实例的方法,在派生类上却会自动返回派生类的实例。
class MyArray extends Array { } let arr = new MyArray(1, 2, 3); let subitems = arr.slice(1, 2); console.log(subitems);