ホームページ ウェブフロントエンド jsチュートリアル jQuery コア アーキテクチャ設計に関する簡単な説明

jQuery コア アーキテクチャ設計に関する簡単な説明

Jan 24, 2017 am 11:20 AM

jQuery は誰にとっても馴染みのあるものではないため、ここでは jQuery が何であるか、またその機能については多くを説明しません。この記事の目的は、ソース コードの簡単な分析を通じて jQuery のコア アーキテクチャ設計について説明することです。 jQuery が JavaScript の高度な機能をどのように利用して、このような優れた JavaScript ライブラリを構築するか。

1 jQuery の最初の紹介

コア関数の観点から見ると、jQuery は 1 つの単純で普通のこと、つまりクエリのみを実行します。その構文は非常に簡潔かつ明確であるため、JavaScript が何であるかを知らずに jQuery を使用している人は、一言で言えば「シンプルでシンプル」です。 設計の観点から見ると、jQuery が提供するメソッドは、静的メソッドとインスタンス メソッドという 2 つの主要なカテゴリに分類できます。静的メソッドは、$ を介して直接アクセスされるメソッドです。これらのメソッドは通常、DOM 要素を操作しませんが、ajax リクエストや文字列に対するいくつかの一般的な操作などのいくつかの共通ツールを提供します。さらに、jQuery は独自の拡張メカニズムも提供します。 extend メソッドを通じて必要なコンポーネントを記述します。インスタンス メソッドは静的メソッドとは異なり、jQuery によってクエリされた DOM 要素を操作するために使用されます。jQuery は $() を実行して、クエリされたすべての DOM 要素を配列メソッドに格納します。 this オブジェクトのプロトタイプ チェーンは、これらの DOM を操作するためのメソッドを実装します。たとえば、各 DOM 要素を走査するために each() メソッドが使用されます。このオブジェクトは「配列として」格納される、つまり、jQuery によって構築されたオブジェクトは配列ではない、と先ほど述べたことに気づいたかもしれません。では、このオブジェクトは正確には何でしょうか? 実際、このオブジェクトは jQuery の核心であり、「jQuery オブジェクト」とも呼ばれます。したがって、この記事の焦点は、jQuery オブジェクトを分析して説明することです。

2 jQuery オブジェクト

通常、jQuery は次のように使用します。

$('div').each(function(index){     //this ...});
ログイン後にコピー

$('div') は、実行後に jQuery オブジェクトを返します。 each() メソッドは、このオブジェクト内の DOM を変更します。要素をたどって、まず $('div') の実行プロセスを見てみましょう (この記事のソース コードは jQuery 3.0 から取得しています):

jQuery = function( selector, context ) {    
    return new jQuery.fn.init( selector, context );

}
ログイン後にコピー

このメソッドは $('div') のエントリ メソッドです, $ は jQuery の略語で、jQuery('div') と同等です。このメソッドは、jQuery.fn.init() 関数のインスタンス オブジェクトを返すという 1 つのことだけを行うことがわかります。以下のコードを見てみましょう:

init = jQuery.fn.init = = jQuery.fn;
ログイン後にコピー

jQuery.fn.init は、セレクターに基づいて修飾された DOM 要素を照会し、それらを返します。返されたものはこれです、これは何ですか?後で分析します: まず、次の文を見てみましょう:

init.prototype = jQuery.fn;
ログイン後にコピー

この文は何を意味しますか? この文は、init メソッドのプロトタイプ オブジェクトが jQuery.fn オブジェクトを指すようにしています。おばけ? コードを見ていきましょう:

jQuery.fn = jQuery.prototype = {    // The current version of jQuery being used    jquery: version,

    constructor: jQuery,    // The default length of a jQuery object is 0
    length: 0,    // Execute a callback for every element in the matched set.
    each: function( callback ) {        return jQuery.each( this, callback );
    },
       
    splice: arr.splice
};
ログイン後にコピー

スペースを節約するために、コードの一部を省略しました。ここからわかるように、jQuery.fn は実際には jQuery のプロトタイプ オブジェクトであり、このプロトタイプ オブジェクトはこれに対するいくつかの操作を定義します。オブジェクト。この時点で少し混乱していると感じても、心配しないでください。アイデアを整理しましょう。jQuery は最初に init メソッドを定義し、次に init プロトタイプ オブジェクト プロトタイプに対する一連の操作メソッドを定義します。最後に、init メソッドのインスタンス オブジェクトが返されます。したがって、上記のプロセスは次のように簡略化できます (擬似コード表現):

var init = function(selector,context,root){   //...   return this;
}

init.prototype = {
   length:0,
   each:function(callback){      //...   },
   splice:[].splice
}

jQuery = function(selector,context,root){   return new init(selector,context,root);
}
ログイン後にコピー

そこで質問は、なぜ jQuery.fn のメソッドが init のプロトタイプではなく、jQuery のプロトタイプ オブジェクトで直接定義されているのかということです。

実は、これの目的はjQueryのクエリ効率を向上させるためで、initのプロトタイプオブジェクトに直接定義すると、クエリが実行されるたびにこのような巨大なプロトタイプオブジェクトがメモリ上に作成され、このオブジェクトが jQuery のプロトタイプで定義されている場合、このオブジェクトは初期化され、今後 $() が実行されるたびに常にメモリ内に存在します。必要なのは init 内のプロトタイプを指すことだけです。毎回同じオブジェクトを作成するのではなく、オブジェクトを作成します。

init 関数で返される this が正確に何であるかを見てみましょう。前回のブログで、関数内の this は実行時に常に呼び出し元を指すと述べました。では、init の呼び出し元は誰でしょうか。上記のコードでは呼び出し元が見つからないようですが、この時点で新しいオペレーターの動作メカニズムを深く理解する必要があるため、前回のブログの新しいオペレーターの説明を借りて、 の実行処理を実行します。 new init() は次のように分解されます:

new init(selector,context,root) = {    var obj = {};

    obj.__proto__ = init.prototype;

    init.call(obj,selector,context,root);    return typeof result === 'obj'? result : obj;

}
ログイン後にコピー

上記の分解プロセスからわかるように、JavaScript が new を通じてインスタンス オブジェクトを作成するとき、まず通常のオブジェクト obj を作成し、次に obj の内部属性 __proto__ を init のプロトタイプ オブジェクトにポイントするため、obj のプロトタイプはチェーンが変更され、ステップ 3 で call メソッドを使用して init() を呼び出すため、init の this はここで obj オブジェクトを参照します。

init() が実行されると、 は一致したすべての DOM オブジェクトを配列の形式でこのオブジェクトに格納して返します。つまり、obj オブジェクトが返され、新しい演算子は最終的にこの obj オブジェクトを次のように返します。新しいインスタンス オブジェクト。 そのため、 new オペレーターによって返されるインスタンス オブジェクトには 2 つの特性があります。1 つ目は、DOM クエリ結果セットが含まれること、2 つ目は、そのプロトタイプ チェーンが init のプロトタイプを継承し、init のプロトタイプが jQuery.fn オブジェクトを指すことです。インスタンス オブジェクト これらの操作方法も使用できます。

jQuery はクエリが実行されるたびに jQuery オブジェクトを作成し、同じアプリケーション内では、すべての jQuery オブジェクトが同じ jQuery プロトタイプ オブジェクトを共有します。したがって、jQuery オブジェクトには DOM クエリ結果セットが含まれるだけでなく、jQuery プロトタイプ オブジェクトの操作メソッドも継承されます。このようにして、クエリ後にメソッドを直接呼び出して、これらの DOM 要素を操作できます。これは jQuery のコア アーキテクチャ設計であり、シンプル、便利、実用的です。

上記の説明がまだ理解できない場合でも、心配しないでください。私は jQuery の設計思想に従って完全な小さなプロジェクト jDate を書きました。比較して理解することができます。 jDate プロジェクトは GitHub にアップロードされています: jDate をクリックすると完全なコードが表示されます。異なる意見がある場合は、お気軽に議論してください。

3 jQuery の欠陥

jQuery のコア アーキテクチャを分析すると、各 jQuery オブジェクトは同じ jQuery プロトタイプを共有しているにもかかわらず、クエリが実行されるたびに、jQuery がメモリ内に複雑な jQuery オブジェクトを構築することがわかります。しかし、jQuery のクエリ プロセスは、さまざまな一致する識別子とさまざまなブラウザの互換性を考慮する必要があります。したがって、DOM 上で単純な操作を行うだけの場合は、jQuery の代わりにネイティブ メソッド querySelector を使用することをお勧めします。ただし、ネイティブ メソッドを使用する場合は、さまざまなアプリケーション シナリオに合わせて互換性の作業を行う必要がある場合があります。 jQuery に依存しすぎないように、トレードオフを考慮してください。

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

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Golang RabbitMQ: 高可用性メッセージ キュー システムのアーキテクチャ設計と実装 Golang RabbitMQ: 高可用性メッセージ キュー システムのアーキテクチャ設計と実装 Sep 28, 2023 am 08:18 AM

GolangRabbitMQ: 高可用性メッセージ キュー システムのアーキテクチャ設計と実装には、特定のコード サンプルが必要です はじめに: インターネット技術の継続的な開発とその広範な応用により、メッセージ キューは現代のソフトウェア システムに不可欠な部分になりました。メッセージ キューは、デカップリング、非同期通信、フォールト トレラント処理、その他の機能を実装するツールとして、分散システムに高可用性とスケーラビリティのサポートを提供します。 Golang は効率的で簡潔なプログラミング言語として、同時実行性とパフォーマンスの高いシステムを構築するために広く使用されています。

MongoDBとエッジコンピューティングの組み合わせ実践とアーキテクチャ設計 MongoDBとエッジコンピューティングの組み合わせ実践とアーキテクチャ設計 Nov 02, 2023 pm 01:44 PM

モノのインターネットとクラウド コンピューティングの急速な発展に伴い、エッジ コンピューティングは徐々に新たな注目の分野になりました。エッジ コンピューティングとは、データ処理効率を向上させ、遅延を削減するために、データ処理およびコンピューティング機能を従来のクラウド コンピューティング センターから物理デバイスのエッジ ノードに転送することを指します。 MongoDB は、強力な NoSQL データベースとして、エッジ コンピューティングの分野でのアプリケーションとしてますます注目を集めています。 1. MongoDB とエッジ コンピューティングを組み合わせる実践 エッジ コンピューティングでは、通常、デバイスのコンピューティング リソースとストレージ リソースは限られています。そしてMongoDB

go-zero アーキテクチャの設計パターンとベスト プラクティス go-zero アーキテクチャの設計パターンとベスト プラクティス Jun 22, 2023 pm 12:07 PM

インターネットの急速な発展に伴い、ソフトウェア開発はますます複雑になってきました。この課題に対処するために、ソフトウェア アーキテクチャも、初期の単一アプリケーションからマイクロサービス アーキテクチャまで進化し続けています。マイクロサービス アーキテクチャの人気に伴い、マイクロサービス間の通信プロトコルとして gRPC を採用する開発者が増えています。 go-zero は、gRPC に基づくマイクロサービス フレームワークです。この記事では、go-zero のアーキテクチャ設計パターンとベスト プラクティスを紹介します。 1. go-zero フレームワーク アーキテクチャ 図 1: go-zero フレームワーク アーキテクチャ 図 1

モール SKU 管理モジュールのアーキテクチャ設計と PHP コード実装 モール SKU 管理モジュールのアーキテクチャ設計と PHP コード実装 Sep 12, 2023 pm 03:18 PM

モール SKU 管理モジュールのアーキテクチャ設計と PHP コード実装 1. はじめに 電子商取引の急速な発展に伴い、モールの規模と複雑さも増大しています。モールの SKU (StockKeepingUnit) 管理モジュールは、モールのコアモジュールの 1 つであり、商品の在庫、価格、属性などの情報を管理します。この記事では、モール SKU 管理モジュールのアーキテクチャ設計と PHP コード実装について紹介します。 2. アーキテクチャ設計 データベース設計 SKU 管理モジュールのデータベース設計は、アーキテクチャ全体の基礎です。モールのSKU

優れたアーキテクチャ: Go 言語を使用して拡張性の高い分散システムを構築する 優れたアーキテクチャ: Go 言語を使用して拡張性の高い分散システムを構築する Jun 18, 2023 pm 02:32 PM

Go 言語は高性能プログラミング言語として、分散システムの構築に非常に人気があります。その高速性と極めて低い遅延により、開発者は拡張性の高い分散アーキテクチャを簡単に実装できます。分散システムを構築する前に、考慮すべきアーキテクチャ上の問題が数多くあります。保守が容易でスケーラブルで安定したアーキテクチャをどのように設計するかは、すべての分散システム開発者が直面する重要な問題です。 Go 言語を使用して分散システムを構築すると、これらのアーキテクチャ上の選択がよりシンプルかつ明確になります。効率的なコルーチン Go 言語はコルーチンをネイティブにサポートしています。

大規模プロジェクトにおける PHP フレームワークに基づくアーキテクチャ設計 大規模プロジェクトにおける PHP フレームワークに基づくアーキテクチャ設計 Jun 03, 2024 pm 12:34 PM

大規模な PHP プロジェクトでは、階層化アーキテクチャや MVC アーキテクチャなどのフレームワークベースのアーキテクチャ設計を採用して、スケーラビリティ、保守性、テスト容易性を実現できます。階層化されたアーキテクチャには、ビュー層、ビジネス ロジック層、およびデータ アクセス層が含まれます。MVC アーキテクチャは、アプリケーションをモデル、ビュー、およびコントローラーに分割します。実装フレームワーク アーキテクチャは、新しい機能の追加を容易にし、メンテナンス コストを削減し、単体テストをサポートするモジュール設計を提供します。

高性能の PHP マイクロサービス アーキテクチャを設計する方法 高性能の PHP マイクロサービス アーキテクチャを設計する方法 Sep 24, 2023 pm 04:37 PM

高性能 PHP マイクロサービス アーキテクチャを設計する方法: インターネットの急速な発展に伴い、マイクロサービス アーキテクチャは多くの企業にとって高性能アプリケーションを構築するための最初の選択肢となっています。軽量のモジュール式アーキテクチャ スタイルであるマイクロサービスは、複雑なアプリケーションをより小さな独立したサービス ユニットに分割し、相互協力を通じて優れたスケーラビリティ、信頼性、保守性を実現します。この記事では、高パフォーマンスの PHP マイクロサービス アーキテクチャを設計する方法を紹介し、具体的なコード例を示します。 1. マイクロサービスの分割 高パフォーマンスの PHP マイクロサービス アーキテクチャを設計する前に、

PHP ファイアウォールの実装: Web サイトのセキュリティ アーキテクチャ設計ガイド PHP ファイアウォールの実装: Web サイトのセキュリティ アーキテクチャ設計ガイド Jun 30, 2023 pm 06:57 PM

Web サイトのセキュリティ アーキテクチャ設計ガイド: PHP ファイアウォールの実装 はじめに: 今日のインターネット時代において、Web サイトのセキュリティ問題はますます深刻になっており、ハッカーは常に抜け穴を利用して Web サイトに侵入し、ユーザー情報を盗み、Web サイトの通常の動作を妨害しています。 Web サイトとそのユーザーのプライバシーとセキュリティを保護するには、信頼性の高いセキュリティ アーキテクチャを確立することが重要です。この記事では、PHP ファイアウォールの実装に焦点を当て、Web サイトのセキュリティ アーキテクチャに関するガイダンスを提供します。 1. PHP ファイアウォールとは何ですか? PHP ファイアウォールは、フィルタリングによって悪意のある攻撃や侵入をブロックするセキュリティ対策です。

See all articles