JQuery源码 4 / 96-283

JQuery.fn = JQuery.prototype = {
    jquery: core_version,
    //设定JQuery的版本号
    constructor: jQuery,
    //将函数指针指向JQuery,这里注意一个点,在我们通过new方法由构建函数创建对象时,我们会对象内部会自动将constructor指针指向构造函数
    /*
    function A(){}
    var a=new A();
    a;// A __proto__:constructor:f A()
    */
    /*
    我们平时使用面想对象的两种写法:
    1. function A(){}
        A.prototype.init=function (){};
    2. function A(){}
        A.prototype={
            init:function(){}
        }
    这两种写法都是可以的,但是会有一个区别,1方法的构造函数new的对象的constructor的指向还是A,但是2方法时我们将A的prototype赋值为一个对    象,那么此时A.prototype的constructor指向已经被我们手动的改变,变为指向改对象,由于该对象是默认对象,所以直接指向了Object,如果我们     之后我们再通过constructor查找会找到Object,所以我们需要手动的将constructor再指向JQuery,避免后续代码出现错误
    */
    init: function (selector, context, rootJQuery) {
        //init jq的选择器的初步过滤和$的返回对象的构造函数,主要目的是在接收用户传入的值之后将其转化为{0:div,1:div,length:2...}这样的形式存储
        //$() //jQuery.fn.init {}
        //所以必须要先了解一个概念,我们在这里使用的this是什么,就是new JQuery.fn.init()获得的对象
        /*
            function $() {
                return new $.prototype.init();
            }
            $.prototype={
                init:function () {
                    console.log(this);
                    this.length=1;
                    return this;
                }
            }
            $(); //init {}
        */

        //selector 当前选择的对象
        //context 执行环境上下文
        //rootJQuery $(document)

        var match, elem;

        while(true){
            console.log("小柯不会贴双眼皮")
        }

        if (!selector) {
            //如果用户没有传入对象,或者传入对象格式为$(null),$(undefined),$(false)格式,直接返回$
            return this;
        }

        if (typeof selector == "string") {
            //如果用户传入的对象是字符串格式
            //$("ele"),$("#id"),$(".class"),$("
  • ") if (selector.charAt(0) == "<" && selector.charAt(selector.length - 1) === ">" && selector.length >= 3) { //匹配$(
  • xx
  • )的情况 math = [null, selector, null]; } else { //匹配$("#id),$("
  • hi")的情况 match = rquickExpr.exec(selector) //exec方法时js的原生方法,得到的是正则中匹配的数组集合,简单理解的话可以理解为匹配的结果会是一个数组,正则中每个括号匹配到的结果会填充到数组中 //rquickExpr正则匹配的是$("#id),$("
  • hi")的情况,其它类型的得到match=null的结果 //$(#id)返回match=['#id',null,'id] $(
  • hi)会得到match=[
  • hi,
  • ,null]的结果 } if (match && (match[1] || !context)) { //继续上一步的排除机制,能进入该流程控制的只有$(
  • xx
  • ),$("
  • hi"),$("#id")的情况 if (match[1]) { //匹配$(
  • hi),$("
  • xxx
  • ") context = context instanceof JQuery ? context[0] : context; //jq支持的写法,例如$(
  • ),$(
  • ,document),$(
  • ,$(document) //判断如果用户传入了context参数,context instanceof JQuery 为true说明用户传入的是$(document),那么context[0]转换为原生document,否则context为用户传入的document jQuery.merge(this, JQuery.parseHTML( math[1], context && context.nodeType ? context.ownerDocument || context : document, //如果content并且具有节点类型(必须是元素节点),那么使用当前用户自定义的执行上下文环境,否则的话默认使用document //注意createElement方法是挂载在document下的,其他节点是无法创建节点的 //ownerDocument写法是针对iframe标签的写法,也就是说如果存在iframe标签,我们可以使用iframe中的document做为执行环境 true )) //jQuery.parseHTML 该方法主要用于将字符转换为数组节点 /* var str='
  • 1
  • 2
  • '; $.parseHTML(str); //[li,li] var match="
  • hi"; $.parseHTML(match); //[li] var march="
  • hi" $.parseHTML(match); //[li.a] */ //该方法接收3个参数,1字符串格式参数,2执行的上下文环境(),3bool值,默认为false,表示不允许用户在$()方法中自己创建script标签,即使用户创建了也不会被添加到DOM结构中,为true表示允许用户创建script标签,我们写str='会直接和当前所在的
  • 你可能感兴趣的:(JQuery源码 4 / 96-283)