この質問に対する素晴らしい回答のおかげで、varargsを使用してjavascript関数を呼び出す方法を理解しています。
今私はコンストラクターでapplyを使用しようとしています
この投稿でいくつかの興味深い情報を見つけました。
しかし、私のコードはエラーをスローしています
試行1:
var mid_parser = new Parser.apply(null, mid_patterns);
エラー:
TypeError: Function.prototype.apply called on incompatible [object Object]
試行2:試行1:
var mid_parser = new Parser.prototype.apply(null, mid_patterns);
エラー:
TypeError: Function.prototype.apply called on incompatible [object Object]
試行2:
function Parser()
{
this.comparemanager = new CompareManager(arguments);
}
mid_patterns = [objA,objB,objC]
var mid_parser = new Parser();
Parser.constructor.apply(mid_parser, mid_patterns);
エラー:
syntax_model.js:91: SyntaxError: malformed formal parameter
試行3:
var mid_parser = Parser.apply(null, mid_patterns);
エラー :
TypeError: this.init is undefined // init is a function of Parser.prototype
当面は回避策があります。
function Parser()
{
if(arguments.length) this.init.call(this,arguments); // call init only if arguments
}
Parser.prototype = {
//...
init: function()
{
this.comparemanager = new CompareManager(arguments);
}
//...
}
var normal parser = new Parser(objA,objB,objC);
mid_patterns = [objA,objB,objC]
var dyn_parser = new Parser();
dyn_parser.init.apply(dyn_parser, mid_patterns);
これはかなりうまく機能しますが、私が望むほどクリーンで普遍的ではありません。
javascriptでvarargsを使用してコンストラクターを呼び出すことは可能ですか?