ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript の「new」演算子は「.apply()」メソッドと連携できますか?

JavaScript の「new」演算子は「.apply()」メソッドと連携できますか?

Barbara Streisand
リリース: 2024-12-17 09:31:25
オリジナル
350 人が閲覧しました

Can JavaScript's `new` Operator Work with the `.apply()` Method?

新しい演算子で .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

このアプローチにはいくつかの利点があります。

  • Date のような特殊なコンストラクターを含むすべてのコンストラクターで動作します。
  • 簡潔に使用され、引数を new に直接渡します。
  • 元のコンストラクターの内容を保持します。 prototype.

説明

Function.prototype.bind は、元の関数のプロパティを継承する新しい関数を作成します。必要な引数を指定してコンストラクター関数を部分的に適用すると、 new キーワードを使用してインスタンスを作成できます。

以上がJavaScript の「new」演算子は「.apply()」メソッドと連携できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート