JavaScript では、apply() メソッドを使用して、任意の数の引数を配列として渡すことができます事前定義された関数に追加され、その機能が拡張される可能性があります。ただし、オブジェクトのインスタンス化に不可欠な new 演算子と組み合わせると、このアプローチには独特の課題が生じます。コンストラクターは通常、固定数の引数を期待します。
私の質問は、オブジェクト インスタンスを作成したいという欲求から生じました。 new 演算子を使用して、コンストラクターに引数を動的に提供します。
障害:
当初、私は次のコンセプトを実装しようとしました:
function Something(){ // Initializations } function createSomething(){ return new Something.apply(null, arguments); } var s = createSomething(a,b,c); //'s' is an instance of Something
しかし、このアプローチは効果がないことが判明しました。
問題への対処:
私の質問に対して数多くの解決策が提案されましたが、どれも解決策を提供しませんでした。 apply() と新しい演算子とのシームレスな統合。代替ソリューションが提案されましたが、それぞれに独自の利点と注意点があります。
推奨ソリューション:
私にとって最も共感を呼んだソリューションは、Matthew Crumley によって提案され、賢い方法を採用していました。 Function.prototype.bind と中間関数を使用するアプローチ:
var createSomething = (function() { function F(args) { return Something.apply(this, args); } F.prototype = Something.prototype; return function() { return new F(arguments); } })();
このアプローチapply() を回避し、目的の機能を実装する別の関数 F を採用します。
別の実行可能なオプション:
Simon Lyall が提供するもう 1 つの注目すべきソリューション、Function.prototype.bind と eval():
function createSomething(){ var args = [].slice.call(arguments), constr = eval("new ("+Something.name+"(" + args+ "))"); return constr; }
を活用しながら、エレガントで簡潔に言えば、このアプローチは eval() に依存しているため、さまざまな環境間でのセキュリティと互換性に関する懸念が生じる可能性があります。
結論:
apply() メソッドは、動的な数の引数を処理する強力な方法ですが、new 演算子との直接統合は JavaScript ではサポートされていません。代わりに、同様の機能を実現する代替ソリューションが用意されており、さまざまな引数を使用してオブジェクト インスタンスを柔軟に作成できます。
以上がJavaScript で「new」演算子を使用してコンストラクターに引数を動的に渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。