ホームページ ウェブフロントエンド jsチュートリアル JavaScript SandBox サンドボックスのデザイン パターン

JavaScript SandBox サンドボックスのデザイン パターン

Nov 28, 2016 pm 03:40 PM
javascript

サンドボックス モードは、YUI3 コアで一般的で、グローバル オブジェクトの汚染を避けるために、同じコンストラクター (Constructor) を使用して独立した非干渉 (自己完結型) インスタンス オブジェクトを生成するメソッドです。

名前空間

JavaScript 自体は名前空間メカニズムを提供していないため、さまざまな関数、オブジェクト、変数名によるグローバル空間の汚染を避けるために、通常のアプローチは、アプリケーションまたはライブラリ用に一意のグローバル オブジェクトを作成することです。次に、すべてのメソッドとプロパティをこのオブジェクトに追加します。

コード リスト 1: 従来の名前空間モード

/* BEFORE: 5 globals */
// constructors
function Parent() {}
function Child() {}
// a variable
var some_var = 1;
// some objects
var module1 = {};
module1.data = {a: 1, b: 2};
var module2 = {};
/* AFTER: 1 global */
// global object
var MYAPP = {};
// constructors
MYAPP.Parent = function() {};
MYAPP.Child = function() {};
// a variable
MYAPP.some_var = 1;
// an object
MYAPP.modules = {};
// nested objects
MYAPP.modules.module1 = {};
MYAPP.modules.module1.data = {a: 1, b: 2};
MYAPP.modules.module2 = {};
ログイン後にコピー

このコードでは、グローバル オブジェクト MYAPP を作成し、他のすべてのオブジェクトと関数を属性として MYAPP にアタッチします。

通常、これは名前の競合を避けるためのより良い方法であり、多くのプロジェクトで使用されていますが、この方法にはいくつかの欠点があります。

追加する必要があるすべての関数と変数にプレフィックスを追加する必要があります。

グローバル オブジェクトは 1 つだけであるため、コードの一部がグローバル オブジェクトを任意に変更し、コードの残りの部分が受動的に更新される可能性があることを意味します。

グローバル コンストラクター

このコンストラクターを Sandbox() という名前でオブジェクトを作成することもできます。コールバック関数はパラメーターとして使用されます。コールバック関数は、コードを保存する独立したサンドボックス環境です。

コード リスト 2: サンドボックスの使用法

new Sandbox(function(box){
    // your code here...
});
ログイン後にコピー

サンドボックスに他の機能を追加しましょう。

「new」演算子を使用せずにサンドボックスを作成できます。

Sandbox() コンストラクターは、オブジェクトの生成に必要なモジュールの名前を定義する追加の構成パラメーターを受け入れます。コードをよりモジュール化したいと考えています。

上記の機能を備えた後、オブジェクトを初期化する方法を見てみましょう。

コード リスト 3 は、「new」演算子を必要とせずに「ajax」モジュールと「event」モジュールを呼び出すオブジェクトを作成できることを示しています。

コード リスト 3: モジュール名を配列として渡す

Sandbox(['ajax', 'event'], function(box){
    // console.log(box);
});
ログイン後にコピー

コード リスト 4: モジュール名を別のパラメーターとして渡す

Sandbox('ajax', 'dom', function(box){
    // console.log(box);
});
ログイン後にコピー

コード リスト 5 は、ワイルドカード '*' をパラメーターとしてコンストラクターに渡すことができることを示しています。 , これは、便宜上、引数としてモジュール名がコンストラクターに渡されない場合、コンストラクターはデフォルトの引数として「*」を渡します。

コード リスト 5: 使用可能なモジュールの呼び出し

Sandbox('*', function(box){
    // console.log(box);
});
Sandbox(function(box){
    // console.log(box);
});
ログイン後にコピー

コード リスト 6 は、サンドボックス オブジェクトを複数回初期化できること、および相互の競合を気にせずにサンドボックス オブジェクトをネストできることを示しています。

コード リスト 6: ネストされたサンドボックス インスタンス

Sandbox('dom', 'event', function(box){
    // work with dom and event
    Sandbox('ajax', function(box) {
    // another sandboxed "box" object
    // this "box" is not the same as
    // the "box" outside this function
    //...
    // done with Ajax
    });
    // no trace of Ajax module here
});
ログイン後にコピー

上記の例からわかるように、サンドボックス モードを使用すると、すべてのコード ロジックをコールバック関数でラップすることで、必要なモジュールに基づいてさまざまなモジュールを生成できます。これらのインスタンスは互いに干渉することなく独立して動作するため、グローバル名前空間が保護されます。

次に、この Sandbox() コンストラクターを実装する方法を見てみましょう。

モジュールの追加

メイン コンストラクターを実装する前に、Sandbox() コンストラクターにモジュールを追加する方法を見てみましょう。 Sandbox() コンストラクター関数もオブジェクトであるため、「modules」という名前の属性を追加できます。この属性は、キーと値のペアのセットを含むオブジェクトになります。各ペアのキーは名前です。登録する必要があるモジュールの値、Value はモジュールのエントリ関数です。コンストラクターが初期化されると、現在のインスタンスが最初のパラメーターとしてエントリ関数に渡されるため、エントリ関数は追加のプロパティとプロパティを追加できます。メソッドをインスタンスに追加します。

コード リスト 7 では、「dom」、「event」、「ajax」モジュールを追加しました。

コード リスト 7: 登録モジュール

Sandbox.modules = {};
Sandbox.modules.dom = function(box) {
    box.getElement = function() {};
    box.getStyle = function() {};
    box.foo = "bar";
};
Sandbox.modules.event = function(box) {
    // access to the Sandbox prototype if needed:
    // box.constructor.prototype.m = "mmm";
    box.attachEvent = function(){};
    box.dettachEvent = function(){};
};
Sandbox.modules.ajax = function(box) {
    box.makeRequest = function() {};
    box.getResponse = function() {};
};
ログイン後にコピー

コンストラクターの実装

コード リスト 8 は、いくつかの重要なポイントを含むコンストラクターの実装方法を説明します。

これが Sandbox のインスタンスであるかどうかを確認し、そうでない場合は Sandbox If を証明します。これは new 演算子によって呼び出されないため、コンストラクターとして再度呼び出します。

コンストラクター内でこれに属性を追加できます。また、コンストラクターのプロトタイプに属性を追加することもできます。

モジュール名は、配列、独立したパラメーター、ワイルドカード文字「*」などのさまざまな形式でコンストラクターに渡されます。

この例では外部ファイルからモジュールをロードする必要はありませんが、YUI3 などのシステムでは、基本モジュール (シードと呼ばれることが多い) のみをロードでき、他のすべてのモジュールは外部ファイルからロードされることに注意してください。 . ファイルにロードされます。

一旦我们知道了所需的模块,并初始化他们,这意味着调用了每个模块的入口函数。

回调函数作为参数被最后传入构造器,它将使用最新生成的实例并在最后执行。

代码清单8:实现Sandbox构造器

<script>
function Sandbox() {
    // turning arguments into an array
    var args = Array.prototype.slice.call(arguments),
    // the last argument is the callback
    callback = args.pop(),
    // modules can be passed as an array or as individual parameters
    modules = (args[0] && typeof args[0] === "string") ?
    args : args[0],
    i;
    // make sure the function is called
    // as a constructor
    if (!(this instanceof Sandbox)) {
        return new Sandbox(modules, callback);
    }
    // add properties to &#39;this&#39; as needed:
    this.a = 1;
    this.b = 2;
    // now add modules to the core &#39;this&#39; object
    // no modules or "*" both mean "use all modules"
    if (!modules || modules === &#39;*&#39;) {
        modules = [];
            for (i in Sandbox.modules) {
                if (Sandbox.modules.hasOwnProperty(i)) {
                    modules.push(i);
            }
        }
    }
    // init the required modules
    for (i = 0; i < modules.length; i++) {
        Sandbox.modules[modules[i]](this);
    }
    // call the callback
    callback(this);
}
// any prototype properties as needed
Sandbox.prototype = {
    name: "My Application",
    version: "1.0",
    getName: function() {
        return this.name;
    }
};
</script>
ログイン後にコピー


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 Dec 17, 2023 pm 02:54 PM

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 Dec 17, 2023 pm 12:09 PM

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 Dec 17, 2023 am 09:39 AM

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

JavaScriptでinsertBeforeを使用する方法 JavaScriptでinsertBeforeを使用する方法 Nov 24, 2023 am 11:56 AM

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと参照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

JavaScript と WebSocket: 効率的なリアルタイム画像処理システムの構築 JavaScript と WebSocket: 効率的なリアルタイム画像処理システムの構築 Dec 17, 2023 am 08:41 AM

JavaScript は Web 開発で広く使用されているプログラミング言語であり、WebSocket はリアルタイム通信に使用されるネットワーク プロトコルです。 2 つの強力な機能を組み合わせることで、効率的なリアルタイム画像処理システムを構築できます。この記事では、JavaScript と WebSocket を使用してこのシステムを実装する方法と、具体的なコード例を紹介します。まず、リアルタイム画像処理システムの要件と目標を明確にする必要があります。リアルタイムの画像データを収集できるカメラ デバイスがあるとします。

See all articles