链式调用

回顾一下: a=ba = b 链式调用例子 : _.chain([1,2,3,4]).filter((num)=>!num%2).map((num)=>num*num).value();

就依照上面那个函数走好了

为了实现链式调用,我们首先需要调用_.chain()处理以下我们的参数

 _.chain = function(obj){
        var instance = _(obj);
        instance._chain = true;
        return instance;
    }

源码很简单,我们把传入的obj处理了一下,结合上面的_函数,回到顶部,传入[1,2,3,4],返回值会是

{
    _wrapped : [1,2,3,4];
    -chain : true;
}

然后我们需要一个函数来判断我们刚添加的_chain属性,也即 chainResult()

//为了判断是否有_.chain(),即是否采用链式调用
    var chainResult = function (instance, obj){
        return instance._chain?_(obj).chain():obj;
    }

然后,在我们在mixin()中调用即可:chainResult(this,func.apply(_,args));

回顾一下:

//mixin()函数部分
_.prototype[name] = function(){
        var args = [this._wrapped];
        push.apply(args,arguments);
        return chainResult(this,func.apply(_,args));
};

我们在调用_.prototype上的函数时,会跳转到mixin()中也即我们定义原型链函数的地方,然后return的时候会调用chainResult函数,然后返回值就会被处理,也即被调用的函数都会返回一个带有_chain : true的对象。

但是我们最后的函数返回值依旧是一个对象,我们需要的是里面的_wrapped,这里就需要我们的_.value()了:

_.prototype.value = function(){
        return this._wrapped;
    }

小节结语,这里,我们完成了一个函数库最基础的布置,下面的章节我们开始向我们的函数库填充抽象出的可复用函数啦!

Last updated