新しい演算子で .apply() メソッドを使用できますか?
JavaScript では、通常、new 演算子を使用してオブジェクト インスタンスを作成します。コンストラクターに引数を明示的に渡す必要があります。ただし、代わりに可変数の引数を渡すことが望ましい場合があります。この質問では、この柔軟性を実現するために、新しい演算子と組み合わせて .apply() メソッドを利用する可能性を検討します。
課題
最初は、次のことを試みるかもしれません。次のコード:
function Something() { // init stuff } function createSomething() { return new Something.apply(null, arguments); } var s = createSomething(a, b, c); // 's' is an instance of Something
ただし、new 演算子は .apply() と互換性がないため、このアプローチは機能しません。
解決策
この制限を克服するために、さまざまな解決策が提案されています。
1. Matthew Crumley のメソッド
このソリューションは、ターゲット コンストラクターから継承する中間関数を使用します。
var createSomething = (function() { function F(args) { return Something.apply(this, args); } F.prototype = Something.prototype; return function() { return new F(arguments); } })();
2. Function.prototype.bind
ECMAScript5 では Function.prototype.bind メソッドが導入されており、関数を部分的に適用できるようになります:
function newCall(Cls) { return new (Function.prototype.bind.apply(Cls, arguments)); }
これは次のように使用できます:
var s = newCall(Something, a, b, c);
使用の利点Function.prototype.bind
このアプローチにはいくつかの利点があります。
説明
Function.prototype.bind は、元の関数のプロパティを継承する新しい関数を作成します。必要な引数を指定してコンストラクター関数を部分的に適用すると、 new キーワードを使用してインスタンスを作成できます。
以上がJavaScript の「new」演算子は「.apply()」メソッドと連携できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。