使用browserify和babelify进行JavaScript ES2015动态继承

时间:2016-05-29 19:56:17

标签: javascript inheritance browserify babel

有没有办法使用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(数组中的数组)。

  1. 我尝试删除超级并直接使用new Predecessor([arguments]);,但会抛出错误(必须调用Predecessor.apply(this, arguments);)。另外,我不想两次执行Predecessor。
  2. 我因沮丧而尝试super,当然,它无法正常工作(抛出捆绑错误)。
  3. 我甚至尝试过eval(知道它的所有副作用)但没有成功,这是一个太复杂的解决方案,甚至不喜欢它。
  4. 我不想强迫开发人员说所有参数都包含在数组中,所以:

    1. 我的最后一个资源是假定最大数量的参数:
    2. 看起来很糟糕,绝对不是最佳做法:

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

1 个答案:

答案 0 :(得分:3)

  

所以Predecessor会执行如下操作:new Predecessor([arguments]):数组中的数组

那就是你写的:super(arguments)将整个对象传递给一个参数。你需要写super(...arguments)来传递参数。或者甚至更好,不要再在ES6中使用arguments object,而是使用其他参数:

class Constructor extends Predecessor {
  constructor(...args) {
    super(...args);
  }
}

(或者如果你不做任何其他事情,只需省略constructor方法,因为这是默认行为。)