深入理解ES6之——JS类的相关知识 (2)

你也可以使用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());//100

extends后面能接受任意类型的表达式,这带来了巨大的可能性,例如动态的决定要继承的类。

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);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zypggf.html