接着上节写.我们在工作中使用jquery的时候常常是这样开始的:
$(document).ready(function(){});
这样写的目的是让文档先加载,然后再开始执行ready.这和调用window.onload方法差不多,当然ready有些好处,比如速度快,会执行多个,不再赘述.我要说的是,它有个简写的方法:
$(function(){});
其实我人生中写的第一段jquery代码就是这样开头的,当时也没有太多的理解,最近看源码,才知道为什么可以这样写,源码大意如下,中间略去N多代码:
var rootjQuey = JQuery(docuemt); rootJQuery.ready = function(){ //具体实现很复杂以后再说 } // 这是我上节写的初始化函数 init(selector){ if(typeof selector == "function"){ return rootjQuery.ready( selector ) ; } }
所以$(function())实际是调用init(function()),那么返回的就是rootjQuery.ready(function()),也就是JQuery(doucment).ready(function()),即$(document).ready(function());
我这两节写的初始化函数都是init,而真正的源码的初始化函数是:
var JQuery = function(selector, context){ reutrn new JQuery.fn.init(selector, context); } // 通过初始化函数构建JQuery对象 var init = JQuery.fn.init = function(selector, context){ // N多代码... }
其中JQuery.fn = JQuery.prototype,也就是JQuery函数的原型对象,而我自己定义的是:
var MyJquery = function(selector){ // 把selector参数传入init中让它去初始化 return new init(selector); }; // 初始化函数,它负责处理传入的参数 var init = function(selector){ alert("传入的参数是"+selector); }
参数context先不说,源码比我多了个JQuery.fn.init();也就是把init()函数定义在了JQuery.fn(JQuery原型对象)上,这样做的好处是可以节省空间. 简单的理解就是:
直接定义init(),每个实例对象都会有一个init()方法.
通过原型对象定义init(),每个实例对象共享一个init()方法.
具体关于对象原型相关的知识,推荐<<javascript高级程序设计>>(我看的是第三版第六章面向对象的程序设计)