addClass: function( value ) { //初始化Jq对象的属性 var classes, elem, cur, clazz, j, finalValue, proceed = typeof value === "string" && value,//看看传进来的东西是不是string类型 i = 0, len = this.length; //如果传一个数组进来则递归调用自己 if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).addClass( value.call( this, j, this.className ) ); }); } if ( proceed ) { classes = ( value || "" ).match( rnotwhite ) || [];//分割字符串 匹配任何非空字符 for ( ; i < len; i++ ) {//对象元素中有几个数目就循环操作几次 elem = this[ i ]; //获取元对象的所有类 cur = elem.nodeType === 1 && ( elem.className ?//对象是元素节点并去掉对象所有空格 ( " " + elem.className + " " ).replace( rclass, " " ) ://去掉换行 制表符 回车符 " " ); if ( cur ) { j = 0; while ( (clazz = classes[j++]) ) {//给clazz 附上当前class if ( cur.indexOf( " " + clazz + " " ) < 0 ) { // 原来的对象里 找 clazz 如果找不到则添加进去 cur += clazz + " "; } } finalValue = jQuery.trim( cur );//去首尾空 if ( elem.className !== finalValue ) {//如果class不为空 则添加属性 elem.className = finalValue; } } } } return this; },