怎么实现面向对象风格调用呢?看一下我们的`_`函数的执行流程
var _ = function(obj){
if(!(this instanceof _)){ // 此处为了实现面向对象风格调用,可以暂时不管
return new _(obj);
}
this._wrapped = obj;
//部分
};
//将obj中所有函数均push进names中
_.functions = function(obj){
var names = [];
for(var key in obj){
if(_.isFunction(obj[key])){
names.push(key);
}
}
return names.sort();
}
//数组遍历
$.each([0,1,2],function(i,n){
console.log('item # '+ i + ": " + n)
})
//item #0:0
//item #1:1
//item #2:2
//对象遍历
$.each({name;"John",lang:"JS"},function(i,n){
console.log('name: '+ i + ",value: " + n)
})
//item name,value:John
//name:lang,value:JS
//退出循环
$.each([0,1,2,3,4,5],function(i,n){
if(i>2){
return false;
}
console.log("item #"+i+": " + n );
});
//item #0:0
//item #1:1
//item #2:2
_.each = function(obj,callback){
var length,i = 0;
//判断类数组对象和数组
if(_.isArrayLike(obj)){
//为数组时
length = obj.length;
for(;i<length;i++){
//绑定this到当前遍历元素上,但是call对性能有一丢丢影响
if(callback.call(obj[i],obj[i],i) === false){
//当回调函数返回false的时候,我们就中止循环
break;
}
}
}else{
//为对象时
for( i in obj){
if(callback.call(obj[i],obj[i],i) === false){
break;
}
}
}
return obj;
}
}
_.mixin = function(obj){
_.each(_.functions(obj),function(name){
var func = _[name] = obj[name];
//原型链的函数在这里定义!调用的时候就会跳到这里了。
_.prototype[name] = function(){
var args = [this._wrapped];
push.apply(args,arguments);
return chainResult(this,func.apply(_,args)); //此处为了链式调用可以暂时不管
};
});
return _;
}