ES6 javascript中Class类继承用法实例详解(5)

上面代码定义了一个MyArray类, 继承了Array构造函数, 因此就可以从MyArray生成数组的实例。 这意味着, ES6 可以自定义原生数据结构( 比如Array、 String 等) 的子类, 这是 ES5 无法做到的。

上面这个例子也说明, extends关键字不仅可以用来继承类, 还可以用来继承原生的构造函数。 因此可以在原生数据结构的基础上, 定义自己的数据结构。 下面就是定义了一个带版本功能的数组。

class VersionedArray extends Array {
 constructor() {
  super();
  this.history = [
   []
  ];
 }
 commit() {
  this.history.push(this.slice());
 }
 revert() {
  this.splice(0, this.length, ...this.history[this.history.length - 1]);
 }
}
var x = new VersionedArray();
x.push(1);
x.push(2);
x // [1, 2]
x.history // [[]]
x.commit();
x.history // [[], [1, 2]]
x.push(3);
x // [1, 2, 3]
x.revert();
x // [1, 2]

上面代码中, VersionedArray结构会通过commit方法, 将自己的当前状态存入history属性, 然后通过revert方法, 可以撤销当前版本, 回到上一个版本。 除此之外, VersionedArray依然是一个数组, 所有原生的数组方法都可以在它上面调用。

下面是一个自定义Error子类的例子。

class ExtendableError extends Error {
 constructor(message) {
  super();
  this.message = message;
  this.stack = (new Error()).stack;
  this.name = this.constructor.name;
 }
}
class MyError extends ExtendableError {
 constructor(m) {
  super(m);
 }
}
var myerror = new MyError('ll');
myerror.message // "ll"
myerror instanceof Error // true
myerror.name // "MyError"
myerror.stack
 // Error
 // at MyError.ExtendableError
 // ...

注意, 继承Object的子类, 有一个行为差异。

class NewObj extends Object {
 constructor() {
  super(...arguments);
 }
}
var o = new NewObj({
 attr: true
});
console.log(o.attr === true); // false

上面代码中, NewObj继承了Object, 但是无法通过super方法向父类Object传参。 这是因为 ES6 改变了Object构造函数的行为, 一旦发现Object方法不是通过new Object() 这种形式调用, ES6 规定Object构造函数会忽略参数。

更多相关内容可查看本站专题:《ECMAScript6(ES6)入门教程》、《JavaScript数组操作技巧总结》、《JavaScript字符与字符串操作技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript错误与调试技巧总结》及《javascript面向对象入门教程》

希望本文所述对大家基于ECMAScript的程序设计有所帮助。