underscore.js如何实现全局变量和链式调用

underscore.js如何得到全局变量 _ :

在整个Underscore.js中,没有通过new便能得到_对象。其实,在underscore.js中是以函数为对象(function也
是对象),将所有的方法都是挂载在这个构造函数上面,然后将这个构造函数挂载在全局变量上,这样便不需要
通过new去使用_。

underscore.js的链式调用:
如果要实现链式调用,必须要在每次的调用后返回一个对象,并且还要保存当前得到的结果。那么要实现链式
调用,必须要使用oop模式。为实现链式调用,在underscore.js中,首先提供了4个函数。

1、_ 函数。
var _ = function(obj) {
    if (obj instanceof _) return obj;//如果obj是_的实例,则直接返回obj
    if (!(this instanceof _)) return new _(obj);//如果不是_的实例,则创建实例
    this._wrapped = obj;//将参数保存在_wrapped上,以便在链上传递使用
};
这个函数有两个作用:
第一个就是我们开头所说的功能,
第二个便是实现链式调用,用来创建_的实例,并将每次调用函数的结果或者参数保存在._wrapped上。

2、_.chain 函数。
_.chain = function(obj) {
     var instance = _(obj);//得到关于 _ 函数的一个实例
     instance._chain = true;// 是否启用链式调用,true为启用
     return instance;//返回实例
};
此函数可以说是整个链式调用的纽带,通过此函数来得到关于 _ 的实例

3、chainResult 函数
var chainResult = function(instance,obj){
    return instance._chain ? _(obj).chain() : obj; //_(obj).chain() 关键的一步,
};
此函数是将每次得到的结果实例化,(得到的实例的_chain属性都不存在)

4、mixin 函数
var mixin = function(obj){
    _.each(_.functions(obj), function(name) {//_.functions返回一个对象的所有方法名
        var func = _[name] = obj[name];
            _.prototype[name] = function() {//把方法添加到_原型上
                var args = [this._wrapped];//得到上一次调用的结果
                push.apply(args, arguments);//将上次得到的结果与本次调用传入的函数合并到一个数组
                return chainResult(this, func.apply(_, args));
		//把每次调用函数得到的结果实例化,得到一个新的实例
        };
   });
   return _;
};
此函数的功能是用扩展 _ 函数,将传进来的参数必须是对象,然后将参数挂载 _ 的原型上。
在这里 通过 mixin( _ ) 将 _ 上所有的方法都挂载在 _ 原型上,这样在实例化的时候,实例能够继承 _ 的
所有方法。

综上所述,

我们首先通过 mixin( _ ) 将 _ 上所有的方法都挂载在 _ 原型上,然后通过 _.chain(obj)得到一个 _ 实例,
开启链式调用(私认为也可以通过原型链进行原型调用)。在链式调用过程中,因为 mixin 这个函数返回一个
匿名函数,起到一个中间代理的的作用,在执行我们调用的方法的同时,将每一次调用的结果实例化并返回。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值