従来、開発者はインスタンスで必要になる可能性のあるデータに対して JavaScript クラス内にプロパティを作成します。コンストラクターですぐに利用できる小さなデータの場合、これは問題ではありません。ただし、インスタンスで使用できるようになる前にデータを計算する必要がある場合は、その料金を前払いしたくない場合があります。たとえば、次のクラスを考えてみましょう。 クラス MyClass { コンストラクタ() { this.data = someExpensiveComputation(); } } ここでは、いくつかの高価な計算を実行した結果として オンデマンド属性モード高価な操作の実行を最適化する最も簡単な方法は、計算を実行する前にデータが必要になるまで待つことです。たとえば、次のように、ゲッター付きのアクセサー プロパティを使用して、オンデマンドで計算を行うことができます。 クラス MyClass { データを取得する() { someExpensiveComputation() を返します。 } } この場合、誰かがその 面倒な遅延読み込みプロパティパターンプロパティにアクセスしたときにのみ計算を実行するのが良いスタートです。本当に必要なのは、その時点以降の情報をキャッシュし、キャッシュされたバージョンのみを使用することです。しかし、この情報を簡単にアクセスできるようにキャッシュする場所はどこでしょうか?これを行う最も簡単な方法は、次のように、同じ名前のプロパティを定義し、その値を計算されたデータに設定することです。 クラス MyClass { データを取得する() { 実際のデータ = someExpensiveComputation(); Object.defineProperty(this, "データ", { 値: 実際のデータ、 書き込み可能: false、 設定可能: false、 列挙可能: false }); 実際のデータを返します。 } } ここで、 const オブジェクト = 新しい MyClass(); // ゲッターを呼び出す 定数 data1 = オブジェクト.data; // データプロパティから読み取ります オブジェクトのデータを返します。 実際、すべての計算は このパターンの欠点の 1 つは、 const オブジェクト = 新しい MyClass(); console.log(object.hasOwnProperty("data")); // 偽 const データ = オブジェクト.データ; console.log(object.hasOwnProperty("data")); // 真 この区別は多くの場合重要ではありませんが、オブジェクトを渡すときに微妙な問題が発生する可能性があるため、このパターンを理解することが重要です。幸いなことに、この問題は更新されたモデルを使用すれば簡単に修正できます。 クラスのプロパティを遅延読み込みするパターン遅延ロードされたプロパティが常にインスタンス内に存在することが重要であるユースケースがある場合は、 クラス MyClass { コンストラクタ() { Object.defineProperty(this, "データ", { 得る() { 実際のデータ = someExpensiveComputation(); Object.defineProperty(this, "データ", { 値: 実際のデータ、 書き込み可能: false、 設定可能: false }); 実際のデータを返します。 }, 設定可能: true、 列挙可能: true }); } } ここで、コンストラクター 次に、ゲッター関数は計算を実行し、 const オブジェクト = 新しい MyClass(); console.log(object.hasOwnProperty("data")); // 真 const データ = オブジェクト.データ; console.log(object.hasOwnProperty("data")); // 真 クラスの場合、これがおそらく使用するパターンです。一方、オブジェクト リテラルを使用すると、より簡単なアプローチが可能になります。 オブジェクトリテラルの遅延読み込みプロパティパターン クラスの代わりにオブジェクト リテラルを使用する場合、オブジェクト リテラルで定義されたゲッターは、データ プロパティと同様に、列挙可能な独自のプロパティ (プロトタイプ プロパティではなく) として定義されるため、プロセスははるかに簡単になります。つまり、オブジェクトに対して煩雑な遅延ロード プロパティ パターンを使用せずに、クラスに対して煩雑な遅延ロード プロパティ パターンを使用できるということです。 定数オブジェクト = { データを取得する() { 実際のデータ = someExpensiveComputation(); Object.defineProperty(this, "データ", { 値: 実際のデータ、 書き込み可能: false、 設定可能: false、 列挙可能: false }); 実際のデータを返します。 } }; console.log(object.hasOwnProperty("data")); // 真 const データ = オブジェクト.データ; console.log(object.hasOwnProperty("data")); // 真 結論はJavaScript でオブジェクト プロパティを再定義する機能は、計算コストが高くなる可能性のある情報をキャッシュする独自の機会を提供します。アクセサー プロパティをデータ プロパティとして再定義して開始すると、プロパティが最初に読み取られるまで計算を延期し、結果をキャッシュして後で使用することが可能になります。このアプローチはクラスとオブジェクト リテラルの両方で機能し、ゲッターがプロトタイプに配置されるかどうかを心配する必要がないため、オブジェクト リテラルでは少し簡単になります。 パフォーマンスを向上させる最善の方法の 1 つは、同じ作業を繰り返し実行しないようにすることです。そのため、結果を後で使用するためにキャッシュできるときはいつでも、プログラムを高速化できます。遅延読み込みプロパティ パターンなどの手法を使用すると、任意のプロパティをキャッシュ レイヤーにしてパフォーマンスを向上させることができます。 上記は、JavaScript の遅延読み込み属性モードの詳細です。js の遅延読み込み属性の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: 10分でDockerを使ったマイクロサービスのデプロイ方法を学ぶ
>>: 更新とデータ整合性処理のためのMySQLトランザクション選択の説明
進捗バーを実装するためのJavaScriptの具体的なコードは参考までに。具体的な内容は次のとおりで...
目次依存関係をインストールするブーストをインストールMySQLをコンパイルしてインストールする構成依...
目次フラット化とは何か再帰トストリング減らすアンダーコア_.平坦化_。連合_。違い要約するフラット化...
現在の要件は、ファイルのアップロード ボタンがあることです。ボタンをクリックすると、アップロードする...
目次1. 構造体はメモリにどのように保存されますか? 2. container_ofマクロ3. 型4...
この CSS リセットは、Eric Meyers の CSS リセットに基づいて変更されており、特に...
目次1. 双方向データバインディングとは1. データの双方向バインディングを実装する必要があるのはな...
場合によっては、フォーム内のテキスト ボックスを読み取り専用にして、ユーザーがその中の情報を変更でき...
ページの主要部分: <body> <ul id="メニュー"&...
CSS3以前は、グラデーション画像は背景画像としてのみ使用できました。 CSS3 のグラデーション構...
序文クラスメートが MLSQL Stack のストリーミング サポートを調査しています。そこで、フロ...
序文この記事では、Nginx の一般的な、実用的で興味深い構成をいくつか紹介します。この記事を読んだ...
1. コマンドの紹介contab (cron テーブル) コマンドは、Windows のスケジュール...
この記事の例では、ショッピングカートの加算と減算、価格計算を実装するためのjsの具体的なコードを共有...
目次1. 数字を逆にする2. 配列内の最大のn個の数値を取得する3. 階乗を計算する4. 現在の動作...