JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptのスマート/自己上書き/遅延(レイジー)ゲッターとは?仕組みと注意点を解説

ゲッターの基本:値は「アクセスされた瞬間」に計算される

JavaScriptのゲッター(getter)は、オブジェクトのプロパティを定義するための構文ですが、最大の特徴はプロパティの値が定義時には計算されないという点にあります。実際にそのプロパティへアクセスしたタイミングで初めて計算が実行されます。

つまり、ゲッターを使えば値の計算コストを、本当にその値が必要になるまで後回しにできます。これがゲッターによる遅延評価(Lazy Evaluation)の基本的な考え方です。

スマート/メモ化ゲッター:計算結果をキャッシュして高速化

さらに一歩進んだのが、計算を遅らせるだけでなく一度計算した結果をキャッシュする「スマートゲッター」「メモ化(memoized)ゲッター」と呼ばれる手法です。

この方式では、値はゲッターが最初に呼ばれたときにだけ計算されます。2回目以降のアクセスでは再計算を行わず、キャッシュされた値がそのまま返されるため、重い処理を繰り返す無駄を省けます。

const config = {
  _cache: null,
  get data() {
    if (this._cache === null) {
      // 初回アクセス時のみ重い計算を実行
      this._cache = loadAndParseHugeFile();
    }
    return this._cache;
  }
};

console.log(config.data); // ここで初めて計算される
console.log(config.data); // 2回目以降はキャッシュを返すだけ

また、ゲッター自身を通常のデータプロパティで「自己上書き」することで、以降のアクセスを完全にキャッシュ参照へ置き換えるテクニックもあります。

const obj = {
  get value() {
    const result = heavyComputation();

    // ゲッターを静的な値を持つプロパティで上書き
    Object.defineProperty(this, 'value', {
      value: result,
      writable: true,
      enumerable: true,
      configurable: true
    });

    return result;
  }
};

注意:値が変わりうるプロパティには使わない

遅延ゲッター(メモ化ゲッター)は便利な反面、値が時間とともに変化する可能性のあるプロパティには適していません

前述のとおり、一度計算・キャッシュされた値は再計算されません。そのため元のデータが更新されても、ゲッターは古い値を返し続けてしまいます。値が動的に変わるケースでは、毎回計算する通常のゲッターを使うか、キャッシュを明示的に無効化する仕組みを用意しましょう。

  1. JavaScriptで学ぶ二分探索木(Binary Search Tree)の基本と操作方法

    二分探索木とは二分探索木は、通常の木構造とは異なる特別な性質を持つデータ構造です。この性質により、データの検索・挿入・削除を効率的に行うことができます。二分探索木では、各ノードが次のルールに従わなければなりません。ノードの左の子は、必ず親ノードより小さい値を持つノードの右の子は、必ず親ノードより大きい値を持つこの規則が成り立つことで、値を探す際に「目的の値より小さければ左へ、大きければ右へ」と分岐をたどるだけで済み、探索範囲を毎回半分に絞り込めます。そのため、整列された配列に対する二分探索と同様の効率性が得られます。本記事を含む木構造のセクションでは、主にこの二分探索木を中心に解説を進めていき

  2. JavaScriptでhref属性の値を取得する方法|jQueryのattr()メソッド活用ガイド

    Web開発では、アンカータグ(<a>)に設定されたリンク先URL、つまりhref属性の値を取得したい場面がよくあります。この記事では、jQueryのattr()メソッドを使って、簡単にhrefの値を取得する方法を解説します。対象となるHTMLの例たとえば、以下のようなアンカータグがあったとします。<a class=demo title=get the url href=./mainPage.jsp/1245>href value at console</a>ここで必要なのは、テキスト部分ではなく、URLそのもの、すなわちhref属性の値「./mainPage