How does jQuery have the $ object constructor and the methods associated with the $?

后端 未结 4 1629
你的背包
你的背包 2021-02-01 09:54

How is it that jQuery can do $(\"#foo\").addClass(\"bar\") and $.ajax()?

I\'m creating a micro javascript framework and want to create a new in

4条回答
  •  自闭症患者
    2021-02-01 10:26

    OK, the $ function is not only a function but an object, like all functions. So it can have methods. That's all that ajax is, a method of the $ function. So we can start off by doing this:

    $ = function(obj) {
      // some code 
    };
    $.ajax = function (arg1, arg2) {
      // some ajax-y code
    };
    

    So far so good. Now, what on earth do we put in the $ function? Well it has to return an object and that object has to have some nice methods defined on it. So we'll need a constructor function (to give us new objects) and a prototype (to provide the nifty methods for those objects).

    $ = function(obj) {
      var myConstructor = function (obj) {
        this.wrappedObj = obj;
      };
    
      myConstructor.prototype = {
        niftyMethod: function () {
          // do something with this.wrappedObj
          return this; // so we can chain method calls
        },
        anotherNiftyMethod: function (options) {
          // do something with this.wrappedObj and options
          return this; 
        }
      };
    
      return new myConstructor(obj);
    };
    

    So there we have it. We can do this:

    var mySnazzObject = $("whatever");
    mySnazzObject.niftyMethod().anotherNiftyMethod(true);        
    

    And we can do this:

    $.ajax("overthere.html", data);
    

    Obviously jQuery does a heck of a lot more than that, and it does it in some really impressive ways, but that's the general idea.

    UPDATE: AS @Raynos was kind enough to observe without supplying a constructive answer, my original code would create the prototype ad infinitum. So we make use of an anonymous autoexecuting function to declare the constructor and prototype separately:

    (function () {
      var myConstructor = function (obj) {
        this.wrappedObj = obj;
      };
    
      myConstructor.prototype = {
        niftyMethod: function () {
          // do something with this.wrappedObj
          return this; // so we can chain method calls
        },
        anotherNiftyMethod: function (options) {
          // do something with this.wrappedObj and options
          return this; 
        }
      };
    
      var $ = function(obj) {
        return new myConstructor(obj);        
      };
    
      $.ajax = function (arg1, arg2) {
        // some ajax-y code
      };
    
      window.$ = $;  
    }());
    

提交回复
热议问题