是否可以通过Browserify和Babelify在ES2015中进行动态继承?

我需要使用额外的功能“构造函数”包装类“ Predecessor”,并且我不知道Predecessor将是什么,因此我不知道参数的数量或有关其执行的任何信息。

通常,对于JS中的动态继承,我会这样做:

function Constructor() {
  Predecessor.apply(this, arguments); // <<-- this is what I'm trying to do.
}
Constructor.prototype = Object.create(Predecessor.prototype);
Constructor.prototype.constructor = Constructor;


当我尝试使用ES2015时:

class Constructor extends Predecessor {
  constructor() {
    super(arguments);
  }
}


super(arguments)转换为:

var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(Singleton).call(this, args));


因此,Predecessor的执行类似于您执行的操作:new Predecessor([arguments]);(数组中的数组)。


我尝试删除super并直接使用Predecessor.apply(this, arguments);,但会引发错误(必须调用super)。另外,我不想执行两次Predecessor。
我试着出于沮丧而尝试super.apply(arguments),它当然不起作用(抛出捆绑错误)。
我什至没有尝试过评估eval(了解其所有副作用),但是这种方法太复杂了,甚至无法解决。


我不想强迫开发人员说所有参数都将包含在数组中,所以:


我的最后一个资源是假设最大数量的参数:


糟糕透顶,绝对不是最佳实践:

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


我当然不喜欢它。

那么,是Babelify / Babel还是ES2015不允许这样做?有什么我可以做些改善的事情(对Babelify的贡献)?还是我应该回到旧的实现方式?

如果您想知道我的编译过程,请执行以下操作:

{
  // ...
  "scripts": {
    "dist": "./node_modules/browserify/bin/cmd.js ./src/index.js -o ./dist/bundle.js -t [ babelify --presets [ es2015 ] ]",
    // ...
  },
  "devDependencies": {
    "babel-preset-es2015": "^6.9.0",
    "babelify": "^7.3.0",
    "browserify": "^13.0.1",
    // ...
  }
}

最佳答案

因此Predecessor会像执行以下操作一样执行:new Predecessor([arguments]):数组中的数组


好吧,这就是您编写的内容:super(arguments)将整个对象传递给一个参数。您需要编写super(...arguments)来传递参数。甚至更好,在ES6中不要再使用arguments object了,而是使用rest参数:

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


(或者,如果您不执行其他任何操作,则忽略constructor方法,因为这是默认行为)。

07-26 01:32