Heim Web-Frontend js-Tutorial Eine kurze Diskussion zum Design der jQuery-Kernarchitektur

Eine kurze Diskussion zum Design der jQuery-Kernarchitektur

Jan 24, 2017 am 11:20 AM

jQuery ist nicht jedem fremd, daher werde ich hier nicht viel darüber sagen, was es ist und was es tut. Der Zweck dieses Artikels besteht darin, den Kern von jQuery anhand einer einfachen Analyse des Architekturdesigns zu diskutieren und wie jQuery erweiterte Funktionen in JavaScript nutzt, um eine so großartige JavaScript-Bibliothek aufzubauen.

1 Erste Einführung in jQuery

Aus Sicht der Kernfunktion führt jQuery nur eine einfache und gewöhnliche Sache aus: Abfragen. Seine Syntax ist so prägnant und klar, dass viele Menschen jQuery bereits verwendet haben, ohne zu wissen, was Javascript ist. Um es mit einem Wort zu beschreiben: Einfachheit und Einfachheit. Aus gestalterischer Sicht können wir die von jQuery bereitgestellten Methoden in zwei Hauptkategorien einteilen: statische Methoden und Instanzmethoden. Statische Methoden sind Methoden, auf die direkt über $ zugegriffen wird. Diese Methoden arbeiten im Allgemeinen nicht mit DOM-Elementen, bieten jedoch einige gängige Tools wie Ajax-Anfragen und einige gängige Operationen für Zeichenfolgen. Darüber hinaus bietet jQuery auch einen eigenen Erweiterungsmechanismus Schreiben Sie die benötigten Komponenten über die Extend-Methode. Die Instanzmethode unterscheidet sich von der statischen Methode. Sie wird verwendet, um die von jQuery abgefragten DOM-Elemente zu bearbeiten. Dieses Objekt speichert alle abgefragten DOM-Elemente in einer Array-Methode Dies Die Prototypenkette des Objekts implementiert Methoden zum Betreiben dieser DOMs. Beispielsweise wird die Methode every() zum Durchlaufen jedes DOM-Elements verwendet. Möglicherweise ist Ihnen aufgefallen, dass ich gerade gesagt habe, dass dieses Objekt „als Array“ gespeichert wird, das heißt, das von jQuery erstellte Objekt ist kein Array. Was genau ist dieses Objekt also? Tatsächlich ist dieses Objekt der Kern von jQuery und wird auch als „jQuery-Objekt“ bezeichnet. Daher liegt der Schwerpunkt dieses Artikels auf der Analyse und Diskussion von jQuery-Objekten.

2 jQuery-Objekt

Im Allgemeinen verwenden wir jQuery wie folgt:

$('div').each(function(index){     //this ...});
Nach dem Login kopieren

$('div ' ) gibt nach der Ausführung ein jQuery-Objekt zurück. Die Methode every() durchläuft die DOM-Elemente in diesem Objekt. Schauen wir uns zunächst den Ausführungsprozess von $('div') an (der Quellcode dieses Artikels stammt aus jQuery 3.0):

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

}
Nach dem Login kopieren

Diese Methode ist die Eingabemethode von $('div'). $ ist die Abkürzung von jQuery, die jQuery('div') entspricht dass diese Methode nur das Instanzobjekt der Funktion jQuery.fn.init() zurückgibt. Schauen wir uns also den folgenden Code an:

init = jQuery.fn.init = = jQuery.fn;
Nach dem Login kopieren

jQuery.fn.init und init beziehen sich auf dieselbe Methode. Diese Methode fragt die qualifizierten DOM-Elemente basierend auf dem Selektor ab und gibt sie zurück. Was ist das? Wir werden es später analysieren. Schauen wir uns zunächst den folgenden Satz an:

init.prototype = jQuery.fn;
Nach dem Login kopieren

Was bedeutet dieser Satz? Objekt, was zum Teufel ist jQuery.fn? Schauen wir uns den Code weiter an:

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
};
Nach dem Login kopieren

Aus Platzgründen habe ich einen Teil des Codes weggelassen. Wie hier zu sehen ist, handelt es sich bei jQuery.fn tatsächlich um das Prototypobjekt von jQuery. Dieses Prototypobjekt definiert einige Methoden für die Bearbeitung dieses Objekts. Wenn Sie an dieser Stelle etwas verwirrt sind, machen Sie sich keine Sorgen, lassen Sie uns die Ideen klären: jQuery definiert zunächst eine Init-Methode und definiert dann eine Reihe von Operationsmethoden für den Init-Prototyp-Objektprototyp. Abschließend wird das Instanzobjekt der Init-Methode zurückgegeben. Der obige Prozess kann also wie folgt vereinfacht werden (Pseudocode-Darstellung):

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);
}
Nach dem Login kopieren

Dann stellt sich die Frage, warum die Methoden in jQuery.fn nicht direkt auf dem Prototyp von init definiert sind ? Um es auf dem Prototypobjekt von jQuery zu definieren?

Der eigentliche Zweck besteht darin, die Abfrageeffizienz von jQuery zu verbessern. Wenn es direkt im Prototypobjekt von init definiert wird, wird bei jeder Ausführung einer Abfrage ein so großes Prototypobjekt erstellt den Speicher, und wenn dieses Objekt im jQuery-Prototyp definiert ist, wird dieses Objekt beim Laden von jQuery initialisiert und ist immer im Speicher vorhanden. Jedes Mal, wenn $() in der Zukunft ausgeführt wird, müssen Sie nur auf den Prototyp in init verweisen dieses Objekt, anstatt jedes Mal das gleiche Objekt zu erstellen.

Schauen wir uns an, was in der Init-Funktion zurückgegeben wird. Ich habe in meinem vorherigen Blog gesagt, dass dies in der Funktion während der Laufzeit immer auf den Aufrufer verweist. Es scheint, dass der Aufrufer im obigen Code nicht zu finden ist. Zu diesem Zeitpunkt müssen wir den Funktionsmechanismus des neuen Operators genau verstehen und die Beschreibung des neuen Operators in meinem vorherigen Blog ausführen new init(). Es ist wie folgt aufgeteilt:

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

    obj.__proto__ = init.prototype;

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

}
Nach dem Login kopieren

Wie aus dem obigen Zerlegungsprozess ersichtlich ist, erstellt JavaScript beim Erstellen eines Instanzobjekts über new zunächst ein gemeinsames Objekt obj und verweist dann das interne Attribut __proto__ von obj auf das Prototypobjekt von init, also obj Das Die Prototypenkette wird geändert und Schritt 3 verwendet die Call-Methode zum Aufrufen von init(), sodass sich dies in init hier auf das obj-Objekt bezieht. Nachdem

init() ausgeführt wurde, speichert alle übereinstimmenden DOM-Objekte in Form eines Arrays in diesem Objekt und gibt es zurück, d. h. das obj-Objekt wird zurückgegeben, und der neue Operator wird zurückgegeben Schließlich wird dieses obj-Objekt als neues Instanzobjekt zurückgegeben. Das vom neuen Operator zurückgegebene Instanzobjekt weist also zwei Merkmale auf: Erstens enthält es die DOM-Abfrageergebnismenge, und zweitens erbt seine Prototypkette den Prototyp von init, und der Prototyp von init zeigt auf das jQuery.fn-Objekt Daher verfügen auch Instanzobjekte über diese Operationsmethoden.

jQuery erstellt jedes Mal ein jQuery-Objekt, wenn eine Abfrage ausgeführt wird, und in derselben Anwendung verwenden alle jQuery-Objekte dasselbe jQuery-Prototypobjekt. Daher enthält das jQuery-Objekt nicht nur die DOM-Abfrageergebnismenge, sondern erbt auch die Operationsmethoden für das jQuery-Prototypobjekt. Auf diese Weise können Sie nach der Abfrage direkt Methoden aufrufen, um diese DOM-Elemente zu bearbeiten. Dies ist das Kernarchitekturdesign von jQuery, einfach, bequem und praktisch!

Wenn Sie die obige Erklärung immer noch nicht verstehen, machen Sie sich keine Sorgen, ich habe ein komplettes kleines Projekt jDate gemäß den Designideen von jQuery geschrieben, das Sie vergleichen und verstehen können! Das jDate-Projekt wurde auf GitHub hochgeladen. Sie können hier klicken, um den vollständigen Code anzuzeigen: jDate.

3 Mängel von jQuery

Durch die Analyse der Kernarchitektur von jQuery werden wir feststellen, dass jQuery jedes Mal, wenn eine Abfrage ausgeführt wird, ein komplexes jQuery-Objekt im Speicher erstellen muss Obwohl jedes jQuery-Objekt denselben jQuery-Prototyp verwendet, ist der Abfrageprozess von jQuery weitaus komplizierter als Sie denken. Er muss verschiedene übereinstimmende Bezeichner und die Kompatibilität verschiedener Browser berücksichtigen. Wenn Sie daher nur einige einfache Vorgänge im DOM ausführen, wird empfohlen, die native Methode querySelector anstelle von jQuery zu verwenden. Bei Verwendung der nativen Methode müssen Sie jedoch möglicherweise einige Kompatibilitätsarbeiten für verschiedene Anwendungsszenarien durchführen Kompromisse eingehen und es nicht übertreiben. Hängt von jQuery ab!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Golang RabbitMQ: Architekturentwurf und Implementierung eines hochverfügbaren Nachrichtenwarteschlangensystems Golang RabbitMQ: Architekturentwurf und Implementierung eines hochverfügbaren Nachrichtenwarteschlangensystems Sep 28, 2023 am 08:18 AM

GolangRabbitMQ: Der architektonische Entwurf und die Implementierung eines hochverfügbaren Nachrichtenwarteschlangensystems erfordern spezifische Codebeispiele. Einführung: Mit der kontinuierlichen Entwicklung der Internettechnologie und ihrer breiten Anwendung sind Nachrichtenwarteschlangen zu einem unverzichtbaren Bestandteil moderner Softwaresysteme geworden. Als Werkzeug zur Erzielung von Entkopplung, asynchroner Kommunikation, fehlertoleranter Verarbeitung und anderen Funktionen bietet die Nachrichtenwarteschlange Unterstützung für hohe Verfügbarkeit und Skalierbarkeit für verteilte Systeme. Als effiziente und prägnante Programmiersprache wird Golang häufig zum Aufbau von Systemen mit hoher Parallelität und hoher Leistung verwendet.

Kombinationspraxis und Architekturdesign von MongoDB und Edge Computing Kombinationspraxis und Architekturdesign von MongoDB und Edge Computing Nov 02, 2023 pm 01:44 PM

Mit der rasanten Entwicklung des Internets der Dinge und des Cloud Computing ist Edge Computing nach und nach zu einem neuen heißen Bereich geworden. Unter Edge Computing versteht man die Übertragung von Datenverarbeitungs- und Rechenkapazitäten von herkömmlichen Cloud-Computing-Zentren auf Edge-Knoten physischer Geräte, um die Effizienz der Datenverarbeitung zu verbessern und die Latenz zu reduzieren. Als leistungsstarke NoSQL-Datenbank erhält MongoDB für seine Anwendung im Bereich Edge Computing immer mehr Aufmerksamkeit. 1. Praxis der Kombination von MongoDB mit Edge Computing Beim Edge Computing verfügen Geräte normalerweise über begrenzte Rechen- und Speicherressourcen. Und MongoDB

Go-Zero-Architekturentwurfsmuster und Best Practices Go-Zero-Architekturentwurfsmuster und Best Practices Jun 22, 2023 pm 12:07 PM

Mit der rasanten Entwicklung des Internets ist die Softwareentwicklung immer komplexer geworden. Um dieser Herausforderung gerecht zu werden, entwickelt sich die Softwarearchitektur ständig weiter, von der ersten Einzelanwendung bis hin zu einer Microservice-Architektur. Mit der Popularität der Microservice-Architektur beginnen immer mehr Entwickler, gRPC als Kommunikationsprotokoll zwischen Microservices zu übernehmen. go-zero ist ein Microservices-Framework, das auf gRPC basiert. In diesem Artikel werden die architektonischen Designmuster und Best Practices von go-zero vorgestellt. 1. Go-Zero-Framework-Architektur Abbildung 1: Go-Zero-Framework-Architektur Abbildung 1

Gute Architektur: Verwendung der Go-Sprache zum Aufbau hochskalierbarer verteilter Systeme Gute Architektur: Verwendung der Go-Sprache zum Aufbau hochskalierbarer verteilter Systeme Jun 18, 2023 pm 02:32 PM

Als leistungsstarke Programmiersprache erfreut sich die Go-Sprache großer Beliebtheit beim Aufbau verteilter Systeme. Seine hohe Geschwindigkeit und extrem niedrige Latenz erleichtern Entwicklern die Implementierung hoch skalierbarer verteilter Architekturen. Vor dem Aufbau eines verteilten Systems müssen viele architektonische Aspekte berücksichtigt werden. Wie man eine Architektur entwerfen kann, die einfacher zu warten, skalierbar und stabil ist, ist eine wichtige Frage, mit der alle Entwickler verteilter Systeme konfrontiert sind. Die Verwendung der Go-Sprache zum Aufbau verteilter Systeme kann diese Architekturentscheidungen einfacher und klarer machen. Effiziente Coroutinen Die Go-Sprache unterstützt Coroutinen nativ.

Architekturentwurf auf Basis des PHP-Frameworks in Großprojekten Architekturentwurf auf Basis des PHP-Frameworks in Großprojekten Jun 03, 2024 pm 12:34 PM

Große PHP-Projekte können ein Framework-basiertes Architekturdesign wie eine mehrschichtige Architektur oder eine MVC-Architektur übernehmen, um Skalierbarkeit, Wartbarkeit und Testbarkeit zu erreichen. Die geschichtete Architektur umfasst die Ansichtsschicht, die Geschäftslogikschicht und die Datenzugriffsschicht; die MVC-Architektur unterteilt die Anwendung in Modelle, Ansichten und Controller. Die Implementierungs-Framework-Architektur bietet ein modulares Design, das das Hinzufügen neuer Funktionen erleichtert, die Wartungskosten senkt und Unit-Tests unterstützt.

Architekturdesign und PHP-Code-Implementierung des Mall-SKU-Verwaltungsmoduls Architekturdesign und PHP-Code-Implementierung des Mall-SKU-Verwaltungsmoduls Sep 12, 2023 pm 03:18 PM

Architekturdesign und PHP-Code-Implementierung des Mall-SKU-Verwaltungsmoduls 1. Einführung Mit der rasanten Entwicklung des E-Commerce nehmen auch die Größe und Komplexität des Einkaufszentrums zu. Das SKU-Verwaltungsmodul (StockKeepingUnit) des Einkaufszentrums ist eines der Kernmodule des Einkaufszentrums und für die Verwaltung des Inventars, des Preises, der Attribute und anderer Informationen der Produkte verantwortlich. In diesem Artikel werden das Architekturdesign und die PHP-Code-Implementierung des Mall-SKU-Verwaltungsmoduls vorgestellt. 2. Architekturdesign Datenbankdesign Das Datenbankdesign des SKU-Verwaltungsmoduls ist die Grundlage der gesamten Architektur. SKU des Einkaufszentrums

So entwerfen Sie eine leistungsstarke PHP-Microservice-Architektur So entwerfen Sie eine leistungsstarke PHP-Microservice-Architektur Sep 24, 2023 pm 04:37 PM

So entwerfen Sie eine leistungsstarke PHP-Microservice-Architektur Mit der rasanten Entwicklung des Internets ist die Microservice-Architektur für viele Unternehmen zur ersten Wahl für die Erstellung leistungsstarker Anwendungen geworden. Als leichter, modularer Architekturstil können Microservices komplexe Anwendungen in kleinere, unabhängige Serviceeinheiten aufteilen und so durch gegenseitige Zusammenarbeit eine bessere Skalierbarkeit, Zuverlässigkeit und Wartbarkeit bieten. In diesem Artikel wird erläutert, wie Sie eine leistungsstarke PHP-Microservice-Architektur entwerfen und spezifische Codebeispiele bereitstellen. 1. Microservices aufteilen Bevor Sie eine leistungsstarke PHP-Microservice-Architektur entwerfen,

PHP-Firewall-Implementierung: Leitfaden zum Design der Website-Sicherheitsarchitektur PHP-Firewall-Implementierung: Leitfaden zum Design der Website-Sicherheitsarchitektur Jun 30, 2023 pm 06:57 PM

Leitfaden zum Design der Website-Sicherheitsarchitektur: Implementierung der PHP-Firewall Einführung: Im heutigen Internetzeitalter werden Website-Sicherheitsprobleme immer schwerwiegender, um in Websites einzudringen, Benutzerinformationen zu stehlen oder den normalen Betrieb der Website zu stören. Um die Privatsphäre und Sicherheit der Website und ihrer Benutzer zu schützen, ist der Aufbau einer zuverlässigen Sicherheitsarchitektur von entscheidender Bedeutung. Dieser Artikel konzentriert sich auf die Implementierung der PHP-Firewall und bietet Anleitungen für die Website-Sicherheitsarchitektur. 1. Was ist eine PHP-Firewall? Die PHP-Firewall ist eine Sicherheitsmaßnahme, die böswillige Angriffe und Eindringlinge durch Filterung blockiert

See all articles