有没有办法使用Browserify和Babelify的ES2015进行动态继承?
我需要包装一个班级" Predecessor"具有额外的功能" Constructor",我不知道Predecessor将会是什么,所以我不知道有关其执行的论点数量或任何内容。
通常,对于JS中的动态继承,我会这样做:
...
$('#contact_form').on('submit', function (e) {
// Prevent form submission
e.preventDefault();
if (true) { // you no longer need the if-block
...
当我尝试使用ES2015时:
function Constructor() {
Predecessor.apply(this, arguments); // <<-- this is what I'm trying to do.
}
Constructor.prototype = Object.create(Predecessor.prototype);
Constructor.prototype.constructor = Constructor;
class Constructor extends Predecessor {
constructor() {
super(arguments);
}
}
转换为:
super(arguments)
所以,var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(Singleton).call(this, args));
执行的操作类似于:Predecessor
(数组中的数组)。
new Predecessor([arguments]);
,但会抛出错误(必须调用Predecessor.apply(this, arguments);
)。另外,我不想两次执行Predecessor。super
,当然,它无法正常工作(抛出捆绑错误)。我不想强迫开发人员说所有参数都包含在数组中,所以:
看起来很糟糕,绝对不是最佳做法:
super.apply(arguments)
我当然不喜欢它。
那么,它只是Babelify / Babel还是ES2015中不允许这样做?我有什么办法可以改善这一点(有助于Babelify)吗?或者我应该回去旧的实施?
如果您想知道我的编译过程:
class Constructor extends Predecessor {
constructor(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) {
super(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z);
}
}
答案 0 :(得分:3)
所以
Predecessor
会执行如下操作:new Predecessor([arguments])
:数组中的数组
那就是你写的:super(arguments)
将整个对象传递给一个参数。你需要写super(...arguments)
来传递参数。或者甚至更好,不要再在ES6中使用arguments
object,而是使用其他参数:
class Constructor extends Predecessor {
constructor(...args) {
super(...args);
}
}
(或者如果你不做任何其他事情,只需省略constructor
方法,因为这是默认行为。)