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

来源:互联网 发布:观念 知乎 编辑:程序博客网 时间:2024/06/17 02:53
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 这个函数返回一个
匿名函数,起到一个中间代理的的作用,在执行我们调用的方法的同时,将每一次调用的结果实例化并返回。
原创粉丝点击