在ES6代码中扩展EcmaScript 5类

Arn*_*ism 9 javascript ecmascript-6

我想在一个新项目中使用EcmaScript 6(通过Browserify和Babelify),但它依赖于用ES5编写的第三方库.问题是在我的项目中创建子类,这些子类从库中的子类扩展而来.

例如:

// Library written in ES5
function Creature(type) {
   this.type = type;
}

// my code in ES6

class Fish extends Creature {
  constructor(name) {
    super("fish");
    this.name = name;
  }
}
Run Code Online (Sandbox Code Playgroud)

这几乎可以工作,除了没有运行Creature()构造函数.我设计了一个解决方法/ hack,它首先构造父类的对象,然后将东西添加到它:

class Fish extends Creature {
  constructor(name) {
    super("throw away"); //have to have this or it wont compile
    let obj = new Creature("fish");
    obj.name = name;
    return obj;
  }
}
Run Code Online (Sandbox Code Playgroud)

只要原始类没有"构造函数"功能,这种方法似乎有效.

我的问题是:使用ES6的类是扩展它们的最佳方法(除了要求图书馆的作者迁移)?还是有更好的方法?我想在我的项目中继续使用class {}语法.

Giu*_*Pes 3

您的解决方案使用 babel 可以正常工作。您的代码将被编译为以下 ES5 代码。

// Library written in ES5
"use strict";

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }

function Creature(type) {
  this.type = type;
}

// my code in ES6

var Fish = (function (_Creature) {
  function Fish(name) {
    _classCallCheck(this, Fish);

    _Creature.call(this, "fish");
    this.name = name;
  }

  _inherits(Fish, _Creature);

  return Fish;
})(Creature);
Run Code Online (Sandbox Code Playgroud)

从上面的代码可以看出,Creature类的构造函数被正确调用。线_Creature.call(this, "fish");

巴别塔链接

我添加了以下代码来演示 Fish 的实例Creature以及 的实例Fish

var fish = new Fish("test");

console.log(fish.type);
console.log(fish.name);

console.log( fish instanceof Creature );
console.log( fish instanceof Fish);
Run Code Online (Sandbox Code Playgroud)

输出:

fish
test
true
true
Run Code Online (Sandbox Code Playgroud)