我想在一个新项目中使用EcmaScript 6(通过Browserify和Babelify),但它依赖于用ES5编写的第三方库。问题是在我的项目中创建子类,这些子类从库中的子类扩展。
E.g:
// 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;
}
}
除了没有运行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;
}
}
只要原始类没有“构造函数”功能,这种方法似乎有效。
我的问题是:在使用ES6的类时是否是扩展它们的最佳方法(除了要求库的作者迁移)?还是有更好的方法?我想在我的项目中继续使用class {}语法。
答案 0 :(得分: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);
从上面的代码中可以看出,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);
输出:
fish
test
true
true
答案 1 :(得分:0)