博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript链式调用的实现方式
阅读量:6939 次
发布时间:2019-06-27

本文共 2778 字,大约阅读时间需要 9 分钟。

本文从ITeye导入 

 

在我们所用到的库中,可以看到很多诸如

$(window).addEvent('load', function(){    $('test').show().setStyle('color', 'red').addEvent('click', function(e){        $(this).setStyle('color', 'yellow');    });});

 的链式调用,那么这样的链式结构是怎么实现的呢,下面我们利用代码来探讨一番:

 

 先分解下,我们队$函数已经很熟悉了,他通常返回一个HTML元素或者HTML元素的集合,如下所示:

function $(){    var elements = [];    for(var i = 0, len = arguments.length; i < len; i++){        var element = els[i];        if(typeof element === 'string'){            element = document.getElementById(element);        }        elements.push(element);    }    return elements;}

 但是,如果把这个函数改造为一个构造器,把那些元素作为数组保存在一个实例属性中,并让所有定义在构造器函数的prototype属性所指对象中的方法都返回用以调用放方法的那个实例的引用,那么他就具有了进行链式调用的能力。

 

先别说的太远,我们首先需要把这个$函数改为一个工厂函数,他负责创建支持链式调用的对象。

(function(){    function _$(els){        this.element = [];        for(var i = 0, len = els.length; i < len; i++){            var element = els[i];            if(typeof element === 'string'){                element = document.getElementById(element);            }            this.element.push(element);        }        return this;    }    window.$ = function(){        return new _$(arguments);    }})();

由于所有对象都会继承其原型对象的属性和方法,所以我们可以让定义原型对象中的那几个方法都返回用以调用方法的实例对象的引用,这样既可以对那些方法进行链式调用,想好这一点,我们现在就动手在_$这个私用构造函数的prototype对象那个中添加方法,以便实现链式调用。

 

(function(){    function _$(els){        this.element = [];        for(var i = 0, len = els.length; i < len; i++){            var element = els[i];            if(typeof element === 'string'){                element = document.getElementById(element);            }            this.element.push(element);        }        return this;    }    _$.prototype = {        each: function(fn){            for(var i = 0, len = this.element.length; i < len; i++){                fn.call(this, this.element[i]);            }            return this;        },        setStyle: function(prop, val){            this.each(function(el){                el.style[prop] = val;            });            return this;        },        show: function(){            var that = this;            this.each(function(el){                that.setStyle('display', 'none');            });            return this;        },        addEvent: function(type, fn){            var add = function(el){                if(window.addEventListener){                    el.addEventListener(type, fn, false);                }else if(window.attachEvent){                    el.attachEvent('on' + type, fn);                }            };            this.each(function(el){                add(el);            });        }    };    window.$ = function(){        return new _$(arguments);    }})();

 

 看看该类每个方法的最后一行,你会发现他们都是以"return this;"结束,这样将用以调用方法的对象传给调用链上的下一个方法。

本文转自Barret Lee博客园博客,原文链接:http://www.cnblogs.com/hustskyking/archive/2012/09/18/3049802.html,如需转载请自行联系原作者

你可能感兴趣的文章
[leetcode] Subsets II
查看>>
linux nginx搭配https
查看>>
spring boot jpa 使用update 报错解决办法
查看>>
解决微信浏览器video全屏的问题
查看>>
强化学习之Q-learning ^_^
查看>>
P3373 【模板】线段树 2
查看>>
初涉MySQL
查看>>
Python监控目录和文件变化
查看>>
PHP基础
查看>>
UPCOJ 2679
查看>>
C++编译头文件和多个cpp
查看>>
c++ 1
查看>>
App数据格式之解析Json
查看>>
Android 类ListView下拉刷新控件实现
查看>>
国家标准全文公开系统
查看>>
webservice的点点滴滴
查看>>
android控件学习之listview
查看>>
SpringMVC_入门项目
查看>>
iperf
查看>>
leetcode_919. Complete Binary Tree Inserter_完全二叉树插入
查看>>