带有browserify和babelify的JavaScript ES2015动态继承
有没有办法使用Browserify和Babelify与ES2015进行动态继承?
我需要用一个额外的功能“构造器”来包装一个类“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]);
(数组内的数组)。
Predecessor.apply(this, arguments);
直接,但它会抛出一个错误( super
必须被调用)。 另外,我不想两次执行Predecessor。 super.apply(arguments)
出于挫折,当然,它不起作用(抛出一个包错误)。 我不想强迫开发者说所有的参数都会被包含在数组中,所以:
糟透了,绝对不是最佳做法:
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
对象,而是使用其他参数:
class Constructor extends Predecessor {
constructor(...args) {
super(...args);
}
}
(或者如果你不做任何事情,就省略constructor
方法,因为这是默认行为)。
上一篇: JavaScript ES2015 dynamic inheritance with browserify and babelify