JavaScript ES2015 动态继承与 browserify 和 babelify
JavaScript ES2015 dynamic inheritance with browserify and babelify
有没有办法通过 Browserify 和 Babelify 对 ES2015 进行动态继承?
我需要用额外的功能包装一个 class "Predecessor" "Constructor",我不知道 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",
// ...
}
}
so Predecessor
gets executed something like if you did: new Predecessor([arguments])
: array within array
嗯,这就是你写的:super(arguments)
将整个对象传递给一个参数。您需要编写 super(...arguments)
来传递参数。或者更好的是,在 ES6 中不再使用 arguments
object,而是使用其余参数:
class Constructor extends Predecessor {
constructor(...args) {
super(...args);
}
}
(或者如果您不执行任何其他操作,则直接省略 constructor
方法,因为这是默认行为)。
有没有办法通过 Browserify 和 Babelify 对 ES2015 进行动态继承?
我需要用额外的功能包装一个 class "Predecessor" "Constructor",我不知道 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",
// ...
}
}
so
Predecessor
gets executed something like if you did:new Predecessor([arguments])
: array within array
嗯,这就是你写的:super(arguments)
将整个对象传递给一个参数。您需要编写 super(...arguments)
来传递参数。或者更好的是,在 ES6 中不再使用 arguments
object,而是使用其余参数:
class Constructor extends Predecessor {
constructor(...args) {
super(...args);
}
}
(或者如果您不执行任何其他操作,则直接省略 constructor
方法,因为这是默认行为)。