ホームページ ウェブフロントエンド jsチュートリアル JSデータアクセスオブジェクトパターンの詳細説明

JSデータアクセスオブジェクトパターンの詳細説明

Jan 27, 2018 pm 05:19 PM
javascript モデル 詳しい説明

この記事では主にJSデザインパターンのデータアクセスオブジェクトパターンの解説例を紹介します。編集者はこれが非常に良いものだと思ったので、皆さんの参考として今から共有します。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。

問題

ほとんどの Web サイトは、ページ間で値を転送するためにフロントエンドに一部のデータ (ユーザー トークンなど) を保存します。一部の大規模な Web アプリケーションでは、保存されるデータが非常に大きくなる可能性があります。複雑になり、大規模なプロジェクトが複数のプログラマーによって共同開発される場合、自分のデータが他の人のデータを上書きしないようにするにはどうすればよいかという問題に遭遇します。全員がページ上で同じ WebStorage オブジェクトを使用するため、全員が使用したキーを記録することはできません。現時点では、データ アクセス オブジェクト パターンを使用して問題を解決できます。

はじめに

HTML5 は、クライアント側でデータを保存するための 2 つの新しい方法、localStorage と sessionStorage を提供します。これらは、Web Storage API によって提供される 2 つのストレージ メカニズムであるのに対し、後者はストレージに限定されるという点です。現在のウィンドウに保存されているデータは、現在のセッションの終了時に削除されます。 localStorage と sessionStorage の具体的な内容についてはここでは紹介しません。実際の開発での合理的な使い方を中心に説明します。

データ アクセス オブジェクト パターン (DAO)

データ アクセス オブジェクト パターンは、データ ソースのアクセスとストレージをカプセル化し、格納されたデータの管理と操作を担当するデータ アクセス オブジェクト クラスを提供し、データ ストレージ形式を標準化します。バックエンド DAO 層。

WebStorage はデータへのアクセスに Key-Value メソッドを使用し、文字列のみを保存できるため (保存時に任意の型が文字列に変換され、読み取り時に型変換が必要になります)、キーの形式を変更できます。モジュール名 + キー、開発者 + キーなど。値にプレフィックスを追加してデータを説明することもできます。たとえば、データのライフサイクルを管理するためにデータの有効期限のタイムスタンプを追加することもできます。特定の形式のプロジェクト チームは、主に管理を容易にし、競合を防止するために、データ アクセス オブジェクトの定義を開始できます。

以下では、localStorage を例として、データ アクセス オブジェクト クラスの定義と使用法を紹介します。

コード例

DAOクラスの基本構造

データアクセスオブジェクトクラスの基本構造は次のとおりです。キーと値の競合を避けるためにキー値に接頭辞を追加し、データ有効期限のタイムスタンプと区切り文字を追加します。取得する値 その値に達した場合に有効期限が切れているかどうかを判定するため、保存データのライフサイクルをより柔軟に管理できます。ここでは、データ アクセス プロセスの特定の結果の取得と、必要に応じた関連操作の実行を容易にするために、コールバック メソッドも使用されます。

/**
 * LocalStorage数据访问类
 * @param {string} prefix Key前缀
 * @param {string} timeSplit 时间戳与存储数据之间的分割符
 */
var Dao = function (prefix, timeSplit) {
  this.prefix = prefix;
  this.timeSplit = timeSplit || '|-|';
}
// LocalStorage数据访问类原型方法
Dao.prototype = {
  // 操作状态
  status: {
    SUCCESS: 0,   // 成功
    FAILURE: 1,   // 失败
    OVERFLOW: 2,  // 溢出
    TIMEOUT: 3   // 过期
  },
  // 本地存储对象
  storage: localStorage || window.localStorage,
  // 获取带前缀的真实键值
  getKey: function (key) {
    return this.prefix + key;
  },
  // 添加(修改)数据
  set: function (key, value, callback, time) {
    ...
  },
  // 获取数据
  get: function (key, callback) {
    ...
  },
  // 删除数据
  remove: function (key, callback) {
    ...
  }
}
ログイン後にコピー

データを追加(変更)

/**
  * 添加(修改)数据
  * @param key 数据字段标识
  * @param value 数据值
  * @param callback 回调函数
  * @param time 过期时间
  */
  set: function (key, value, callback, time) {
    // 默认为成功状态
    var status = this.status.SUCCESS,
      key = this.getKey(key);
    try {
      // 获取过期时间戳
      time = new Date(time).getTime() || time.getTime();
    } catch (e) {
      // 未设置过期时间时默认为一个月
      time = new Date().getTime() + 1000 * 60 * 60 * 24 * 30;
    }
    try {
      // 向本地存储中添加(修改)数据
      this.storage.setItem(key, time + this.timeSplit + value);
    } catch (e) {
      // 发生溢出
      status = this.status.OVERFLOW;
    }
    // 执行回调并传入参数
    callback && callback.call(this, status, key, value);
  }
ログイン後にコピー

データを取得

/**
  * 获取数据
  * @param key 数据字段标识
  * @param callback 回调函数
  */
  get: function (key, callback) {
    var key = this.getKey(key),
      status = this.status.SUCCESS,  // 获取数据状态
      value = null;  // 获取数据值

    try {
      // 从本地存储获取数据
      value = this.storage.getItem(key);
    } catch (e) {
      // 获取数据失败
      status = this.status.FAILURE;
      value = null;
    }

    // 如果成功获取数据
    if (status !== this.status.FAILURE) {
      var index = value.indexOf(this.timeSplit),
        timeSplitLen = this.timeSplit.length,
        // 获取时间戳
        time = value.slice(0, index);
      // 判断数据是否未过期
      if (new Date(1*time).getTime() > new Date().getTime() || time == 0) {
        // 获取数据值
        value = value.slice(index + timeSplitLen);
      } else {
        // 数据已过期,删除数据
        value = null;
        status = this.status.TIMEOUT;
        this.remove(key);
      }
    }

    // 执行回调
    callback && callback.call(this, status, value);
    // 返回结果值
    return value;
  }
ログイン後にコピー

データを削除

/**
  * 删除数据
  * @param key 数据字段标识
  * @param callback 回调函数
  */
  remove: function (key, callback) {
    // 设置默认状态为失败
    var status = this.status.FAILURE,
      key = this.getKey(key),
      value = null;
    try {
      // 获取数据值
      value = this.storage.getItem(key);
    } catch (e) {
      // 数据不存在,不采取操作
    }
    // 如果数据存在
    if (value) {
      try {
        // 删除数据
        this.storage.removeItem(key);
        status = this.status.SUCCESS;
      } catch (e) {
        // 数据删除失败,不采取操作
      }
    }
    // 执行回调并传入参数,删除成功则传入被删除的数据值
    callback && callback.call(this, status, status > 0 ? null : value.slice(value.indexOf(this.timeSplit) + this.timeSplit.length));
  }
ログイン後にコピー

使用法

var dao = new Dao('myModule_');
// 添加/修改数据
dao.set('token', 'abc', function () { console.log(arguments); });
// 获取数据
var value = dao.get('token', function () { console.log(arguments); });
console.log(value);
// 删除数据
dao.remove('token', function () { console.log(arguments); });
ログイン後にコピー

最後に書きました

実際、データアクセスオブジェクトモードは、次のようなサーバー側のデータベース操作に適しています。データベースの追加、削除、変更、クエリ操作をカプセル化することで、フロントエンド ストレージの管理が容易になり、DAO が提供するデータベースの操作を心配する必要がなくなります。便利で統一されたインターフェイスを備えているため、チーム開発中に他の人の作業に影響を与えることを心配する必要がありません。

関連する推奨事項:

php デザイン パターン DAO (データ アクセス オブジェクト パターン)

Yii 学習の概要 データ アクセス オブジェクト (DAO)、yiidao_PHP チュートリアル

JavaScript の 2 種類のオブジェクト指向アクセス オブジェクト プロパティメソッド分析_JavaScriptスキル

以上がJSデータアクセスオブジェクトパターンの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

WeChat の「おやすみモード」は何をするのですか? WeChat の「おやすみモード」は何をするのですか? Feb 23, 2024 pm 10:48 PM

WeChat のサイレント モードとはどういう意味ですか? 現在、スマートフォンの人気とモバイル インターネットの急速な発展により、ソーシャル メディア プラットフォームは人々の日常生活に欠かせないものとなっています。 WeChat は中国で最も人気のあるソーシャル メディア プラットフォームの 1 つであり、ほとんどの人が WeChat アカウントを持っています。私たちは WeChat を通じて友人、家族、同僚とリアルタイムでコミュニケーションを取り、生活の瞬間を共有し、お互いの現在の状況を理解することができます。しかし、この時代では、特に集中力や集中力が必要な人々にとって、情報過多やプライバシー漏洩の問題にも必然的に直面します。

Win11での管理者権限の取得について詳しく解説 Win11での管理者権限の取得について詳しく解説 Mar 08, 2024 pm 03:06 PM

Windows オペレーティング システムは世界で最も人気のあるオペレーティング システムの 1 つであり、その新バージョン Win11 が大きな注目を集めています。 Win11 システムでは、管理者権限の取得は重要な操作であり、管理者権限を取得すると、ユーザーはシステム上でより多くの操作や設定を実行できるようになります。この記事では、Win11システムで管理者権限を取得する方法と、権限を効果的に管理する方法を詳しく紹介します。 Win11 システムでは、管理者権限はローカル管理者とドメイン管理者の 2 種類に分かれています。ローカル管理者はローカル コンピュータに対する完全な管理権限を持っています

Oracle SQLの除算演算の詳細説明 Oracle SQLの除算演算の詳細説明 Mar 10, 2024 am 09:51 AM

OracleSQL の除算演算の詳細な説明 OracleSQL では、除算演算は一般的かつ重要な数学演算であり、2 つの数値を除算した結果を計算するために使用されます。除算はデータベース問合せでよく使用されるため、OracleSQL での除算演算とその使用法を理解することは、データベース開発者にとって重要なスキルの 1 つです。この記事では、OracleSQL の除算演算に関する関連知識を詳細に説明し、読者の参考となる具体的なコード例を示します。 1. OracleSQL での除算演算

iPhoneでサイレントモードが機能しない:修正 iPhoneでサイレントモードが機能しない:修正 Apr 24, 2024 pm 04:50 PM

おやすみモードで電話に応答することさえ、非常に煩わしい経験になる可能性があります。名前が示すように、おやすみモードでは、すべての着信通知と電子メール、メッセージなどからの警告がオフになります。これらのソリューション セットに従って問題を修正できます。解決策 1 – フォーカス モードを有効にする 携帯電話でフォーカス モードを有効にします。ステップ 1 – 上から下にスワイプしてコントロール センターにアクセスします。ステップ 2 – 次に、携​​帯電話の「フォーカスモード」を有効にします。フォーカス モードでは、電話機のサイレント モードが有効になります。携帯電話に着信通知が表示されることはありません。解決策 2 – フォーカス モード設定を変更する フォーカス モード設定に問題がある場合は、修正する必要があります。ステップ 1 – iPhone の設定ウィンドウを開きます。ステップ 2 – 次に、フォーカス モード設定をオンにします

PHPモジュロ演算子の役割と使い方を詳しく解説 PHPモジュロ演算子の役割と使い方を詳しく解説 Mar 19, 2024 pm 04:33 PM

PHP のモジュロ演算子 (%) は、2 つの数値を除算した余りを取得するために使用されます。この記事では、モジュロ演算子の役割と使用法について詳しく説明し、読者の理解を深めるために具体的なコード例を示します。 1. モジュロ演算子の役割 数学では、整数を別の整数で割ると、商と余りが得られます。たとえば、10 を 3 で割ると、商は 3 になり、余りは 1 になります。モジュロ演算子は、この剰余を取得するために使用されます。 2. モジュロ演算子の使用法 PHP では、% 記号を使用してモジュロを表します。

Linuxシステムコールsystem()関数の詳細説明 Linuxシステムコールsystem()関数の詳細説明 Feb 22, 2024 pm 08:21 PM

Linux システム コール system() 関数の詳細説明 システム コールは、Linux オペレーティング システムの非常に重要な部分であり、システム カーネルと対話する方法を提供します。その中でも、system()関数はよく使われるシステムコール関数の一つです。この記事では、system() 関数の使用法を詳しく紹介し、対応するコード例を示します。システム コールの基本概念 システム コールは、ユーザー プログラムがオペレーティング システム カーネルと対話する方法です。ユーザープログラムはシステムコール関数を呼び出してオペレーティングシステムを要求します。

Linuxのcurlコマンドの詳しい説明 Linuxのcurlコマンドの詳しい説明 Feb 21, 2024 pm 10:33 PM

Linuxのcurlコマンドの詳細な説明 要約:curlは、サーバーとのデータ通信に使用される強力なコマンドラインツールです。この記事では、curl コマンドの基本的な使用法を紹介し、読者がコマンドをよりよく理解して適用できるように実際のコード例を示します。 1.カールとは何ですか? curl は、さまざまなネットワーク要求を送受信するために使用されるコマンド ライン ツールです。 HTTP、FTP、TELNETなどの複数のプロトコルをサポートし、ファイルアップロード、ファイルダウンロード、データ送信、プロキシなどの豊富な機能を提供します。

ラップトップは毎回シャットダウンする必要がありますか? ラップトップは毎回シャットダウンする必要がありますか? Feb 19, 2024 pm 12:09 PM

Windows ラップトップには休止状態とシャットダウンのオプションが付属しています。ラップトップをスリープ モードにすると、低電力モードになり、そのままの状態で作業を続けることができます。ラップトップをシャットダウンした場合は、すべてのプログラムと作業内容を閉じて、最初からやり直す必要があります。一日中ラップトップを使用せずに休憩したい場合は、スリープ モードまたは休止状態モードが良い選択肢です。ドアを閉めるのはどうですか?ラップトップは毎回シャットダウンする必要がありますか?確認してみましょう。ラップトップは毎回シャットダウンする必要がありますか?特に長期間使用しない場合は、エネルギーを節約し、デバイスの寿命を延ばすためにラップトップの電源を切ることをお勧めします。ただし、日中はラップトップをスリープ モードにしてタスクを続行することをお勧めします。

See all articles