search
HomeWeb Front-endJS TutorialA brief discussion on jQuery core architecture design

jQuery is no stranger to everyone, so I won’t say much here about what it is and what it does. The purpose of this article is to discuss the core of jQuery through a simple analysis of the source code. Architectural design, and how jQuery leverages advanced features in JavaScript to build such a great JavaScript library.

1 First introduction to jQuery

From the core function point of view, jQuery only does one simple and ordinary thing: query. Its syntax is so concise and clear that many people have already used jQuery without knowing what javascript is. To describe it in one word, it is: simplicity and simplicity. From a design perspective, we can divide the methods provided by jQuery into two major categories: static methods and instance methods. Static methods are methods accessed directly through $. These methods generally do not operate on DOM elements, but provide some common tools, such as ajax requests and some common operations on strings. In addition, jQuery also provides With its own extension mechanism, you can write the components you need through the extend method. The instance method is different from the static method. It is used to operate on the DOM elements queried by jQuery. jQuery executes $() to construct a jQuery object. This object stores all the DOM elements queried in an array method, and then in this The object's prototype chain implements methods for operating these DOMs. For example, the each() method is used to traverse each DOM element. You may notice that I just said that this object is stored "as an array", that is to say, the object constructed by jQuery is not an array, so what exactly is this object? In fact, this object is the core of jQuery, also known as "jQuery object". Therefore, the focus of this article is to analyze and discuss jQuery objects.

2 jQuery object

Generally, we will use jQuery like this:

$('div').each(function(index){     //this ...});

$('div') After execution, a jQuery object is returned. The each() method traverses the DOM elements in this object. Let's first look at the execution process of $('div') (the source code of this article is taken from jQuery 3.0):

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

}

This method is the entry method of $('div'). $ is the abbreviation of jQuery, which is equivalent to jQuery('div'). It can be seen that this method only does one thing. That is to return the instance object of the jQuery.fn.init() function. So what is jQuery.fn.init? Let’s look at the following code:

init = jQuery.fn.init = = jQuery.fn;

jQuery.fn. init and init refer to the same method. This method queries the qualified DOM elements based on the selector and returns them. But you will find that what is returned is this. What is this? We will analyze it later. Let’s first look at the following sentence:

init.prototype = jQuery.fn;

What does this sentence mean? This sentence makes the prototype object of the init method point to the jQuery.fn object. , so what the hell is jQuery.fn? Let's continue to look at the code:

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
};

In order to save space, I have omitted some of the code. As can be seen from here, jQuery.fn is actually the prototype object of jQuery. This prototype object is defined in There are some methods to operate on this object. If you feel a little confused at this point, don't worry, let's sort out the ideas: jQuery first defines an init method, and then defines a series of operation methods on the init prototype object prototype. Finally, the instance object of the init method is returned. So the above process can be simplified as follows (pseudocode representation):

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);
}

Then the question is, why are the methods in jQuery.fn not directly defined on the init prototype, but defined On jQuery's prototype object?

Actually, the purpose of this is to improve the query efficiency of jQuery. If it is directly defined on the prototype object of init, then every time a query is executed, such a huge prototype object will be created in the memory, and If this object is defined on jQuery's prototype, this object will be initialized when jQuery is loaded and will always exist in memory. Every time $() is executed in the future, you only need to point the prototype in init to this object. Instead of creating the same object every time.

Let’s take a look at what exactly this is returned in the init function. I said in my previous blog that this in the function always points to the caller during runtime. So who is the caller of init? ? It seems that the caller cannot be found in the above code. At this time, we need to deeply understand the operating mechanism of the new operator. Borrowing from my previous description of the new operator in my blog, we will carry out the execution process of new init(). It’s broken down as follows:

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

    obj.__proto__ = init.prototype;

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

}

It can be seen from the above decomposition process that when JavaScript creates an instance object through new, it will first create a common object obj, and then point the internal attribute __proto__ of obj to the prototype object of init, so obj The prototype chain will be changed, and step 3 uses the call method to call init(), so this in init refers to the obj object here.

After init() is executed, will store all matched DOM objects in the form of an array into this object and return it, that is, the obj object will be returned, and the new operator will eventually This obj object is returned as the new instance object. So the instance object returned by the new operator has two characteristics: first, it contains the DOM query result set, and second, its prototype chain inherits the prototype of init, and the prototype of init points to the jQuery.fn object, so Instance objects also have these operation methods.

jQuery creates a jQuery object every time a query is executed, and in the same application, all jQuery objects share the same jQuery prototype object. Therefore, the jQuery object not only contains the DOM query result set, but also inherits the operation methods on the jQuery prototype object. In this way, you can directly call methods to manipulate these DOM elements after querying. This is the core architecture design of jQuery, which is simple, convenient and practical!

If you still don’t understand the above explanation, don’t worry, I wrote a complete small project jDate according to jQuery’s design ideas, you can compare and understand! The jDate project has been uploaded to GitHub. You can click here to view the complete code: jDate. If you have different opinions, please feel free to discuss!

3 Defects of jQuery

By analyzing the core architecture of jQuery, we will find that every time a query is executed, jQuery will build a complex jQuery in memory Object, although every jQuery object shares the same jQuery prototype, the query process of jQuery is far more complicated than you think. It must consider various matching identifiers and the compatibility of different browsers. Therefore, if you only do some simple operations on the DOM, it is recommended to use the native method querySelector instead of jQuery. However, when using the native method, you may have to do some compatibility work for different application scenarios. You must learn to make trade-offs and not overdo it. Depends on jQuery!

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
JavaScript in Action: Real-World Examples and ProjectsJavaScript in Action: Real-World Examples and ProjectsApr 19, 2025 am 12:13 AM

JavaScript's application in the real world includes front-end and back-end development. 1) Display front-end applications by building a TODO list application, involving DOM operations and event processing. 2) Build RESTfulAPI through Node.js and Express to demonstrate back-end applications.

JavaScript and the Web: Core Functionality and Use CasesJavaScript and the Web: Core Functionality and Use CasesApr 18, 2025 am 12:19 AM

The main uses of JavaScript in web development include client interaction, form verification and asynchronous communication. 1) Dynamic content update and user interaction through DOM operations; 2) Client verification is carried out before the user submits data to improve the user experience; 3) Refreshless communication with the server is achieved through AJAX technology.

Understanding the JavaScript Engine: Implementation DetailsUnderstanding the JavaScript Engine: Implementation DetailsApr 17, 2025 am 12:05 AM

Understanding how JavaScript engine works internally is important to developers because it helps write more efficient code and understand performance bottlenecks and optimization strategies. 1) The engine's workflow includes three stages: parsing, compiling and execution; 2) During the execution process, the engine will perform dynamic optimization, such as inline cache and hidden classes; 3) Best practices include avoiding global variables, optimizing loops, using const and lets, and avoiding excessive use of closures.

Python vs. JavaScript: The Learning Curve and Ease of UsePython vs. JavaScript: The Learning Curve and Ease of UseApr 16, 2025 am 12:12 AM

Python is more suitable for beginners, with a smooth learning curve and concise syntax; JavaScript is suitable for front-end development, with a steep learning curve and flexible syntax. 1. Python syntax is intuitive and suitable for data science and back-end development. 2. JavaScript is flexible and widely used in front-end and server-side programming.

Python vs. JavaScript: Community, Libraries, and ResourcesPython vs. JavaScript: Community, Libraries, and ResourcesApr 15, 2025 am 12:16 AM

Python and JavaScript have their own advantages and disadvantages in terms of community, libraries and resources. 1) The Python community is friendly and suitable for beginners, but the front-end development resources are not as rich as JavaScript. 2) Python is powerful in data science and machine learning libraries, while JavaScript is better in front-end development libraries and frameworks. 3) Both have rich learning resources, but Python is suitable for starting with official documents, while JavaScript is better with MDNWebDocs. The choice should be based on project needs and personal interests.

From C/C   to JavaScript: How It All WorksFrom C/C to JavaScript: How It All WorksApr 14, 2025 am 12:05 AM

The shift from C/C to JavaScript requires adapting to dynamic typing, garbage collection and asynchronous programming. 1) C/C is a statically typed language that requires manual memory management, while JavaScript is dynamically typed and garbage collection is automatically processed. 2) C/C needs to be compiled into machine code, while JavaScript is an interpreted language. 3) JavaScript introduces concepts such as closures, prototype chains and Promise, which enhances flexibility and asynchronous programming capabilities.

JavaScript Engines: Comparing ImplementationsJavaScript Engines: Comparing ImplementationsApr 13, 2025 am 12:05 AM

Different JavaScript engines have different effects when parsing and executing JavaScript code, because the implementation principles and optimization strategies of each engine differ. 1. Lexical analysis: convert source code into lexical unit. 2. Grammar analysis: Generate an abstract syntax tree. 3. Optimization and compilation: Generate machine code through the JIT compiler. 4. Execute: Run the machine code. V8 engine optimizes through instant compilation and hidden class, SpiderMonkey uses a type inference system, resulting in different performance performance on the same code.

Beyond the Browser: JavaScript in the Real WorldBeyond the Browser: JavaScript in the Real WorldApr 12, 2025 am 12:06 AM

JavaScript's applications in the real world include server-side programming, mobile application development and Internet of Things control: 1. Server-side programming is realized through Node.js, suitable for high concurrent request processing. 2. Mobile application development is carried out through ReactNative and supports cross-platform deployment. 3. Used for IoT device control through Johnny-Five library, suitable for hardware interaction.

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Atom editor mac version download

Atom editor mac version download

The most popular open source editor

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.