链式调用的形式其实就是对象调用一连串的方法。为什么能连续调用这么多的方法?因为调用方法返回调用的对象,于是乎就可以一如既往,一往无前地调用下去。链式调用的原理就是在方法中返回执行上下文this,每次调用完方法就像散文一样形散而神不散。链式调用有化腐朽为神奇的功效,一来可以节省代码,二来美观实用神奇,三来整洁有序,不失大将之风。下面以Link类为例:调用四个方法却始终返回new Link(),相信这个例子很容易理解。

var Link = function (){};

Link.prototype = {
method1: function (){return this;},
method2: function (){return this;},
method3: function (){return this;},
method4: function (){return this;}
} new Link().method1().method2().method3().method4();

明白原理之后,下面真正来体验下jQuery的链式调用。用htmlElementsArray存放着选中的html元素。这里写了筛选class,id选择器的构造方法。

var Link = function (name){
this.htmlElementsArray = [];
if(typeof name !== 'string' && typeof name !== 'object') {
throw new Error('Name must be a string or a object!');
}else{
if(/\./.test(name)){
var obj = document.getElementsByClassName(name.substr(1));
for(var i = 0, len = obj.length; i < len; i++) {
this.htmlElementsArray.push(obj[i]);
}
}else if(/#/.test(name)){
this.htmlElementsArray.push(document.getElementById(name.substr(1)));
}else{
this.htmlElementsArray.push(name);
}
}
}

each方法:

Link.prototype = {
each: function (fn) {
for(var i = 0, len = this.htmlElementsArray.length; i < len; i++) {
fn.call(this, this.htmlElementsArray[i]);
}
return this;
}
}

添加addClass方法,调用each时返回this,运用了链式原理。

addClass: function (string){
this.each(function (ele){
ele.className += " "+string;
       //$(this)
});
return this;
}

css方法添加样式,show方法显示元素,hide隐藏元素,on进行事件监听。

    css: function (property, value) {
this.each(function (ele){
ele.style[property] = value;
});
return this;
},
show: function (){
this.each(function (ele){
ele.style.display = 'block';
});
return this;
},
hide: function (){
this.each(function (ele){
ele.style.display = 'none';
})
return this;
},
on: function (type, fn, useCaptrue){
this.each(function (ele) {
window.addEventListener ? ele.addEventListener(type, fn, useCaptrue || false) : ele.attachEvent('on' + type, fn);
});
return this;
}

最后封闭在$方法里。

var $ = function (name){
return new Link(name);
}

我们赶紧来试下来吧!

$('.syc').addClass('yes').css('background', 'red').show().on('click', function (){
$(this).hide();
}, false);

仿jQuery之链式调用的更多相关文章

  1. jquery之链式调用,层级菜单

    一. 链式调用的含义 jquery对象的方法会在执行完后返回这个jquery对象,所有jquery对象的方法可以连起来写: $('#div1') // id为div1的元素 .children('ul ...

  2. Javasript设计模式之链式调用

    写过jquery的可能都知道,jquery里面可以很方便的使用以下代码: // 不使用链式调用 const element = $(ele); element.addClass('red'); ele ...

  3. spring aop 之链式调用

    关关雎鸠,在河之洲.窈窕淑女,君子好逑. 概述 AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横 ...

  4. Jquery复习(三)之链式调用

    通过 jQuery,可以把动作/方法链接在一起. Chaining 允许我们在一条语句中运行多个 jQuery 方法(在相同的元素上). jQuery 方法链接 直到现在,我们都是一次写一条 jQue ...

  5. 深入了解jQuery之链式结构

    本文是在阅读了Aaron艾伦的jQuery源码解析(地址:http://www.imooc.com/learn/172)后的个人体会以及笔记.在这里感谢艾伦老师深入浅出的讲解!! 1 什么是链式? 先 ...

  6. mark jquery 链式调用的js原理

    我们在使用jquery的时候会用到类似$("#id").css('color','red').show(200); 这样写有点减少代码量,减少了逐步查询DOM的性能损耗: js 原 ...

  7. jQuery链式调用

    <script> var arr = function(){ return new arr.prototype.init(); } arr.prototype.init = functio ...

  8. jQuery之链式编程

    使用的思想:隐式迭代. <button>快速</button> <button>快速</button> <button>快速</but ...

  9. JavaScript设计模式-8.链式调用

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

随机推荐

  1. [Cocos2d-x v3.x]浅谈容器Vector

    转载请注明来自:star特530的CSDN博客 http://blog.csdn.net/start530/article/details/19170853 前两天有人问我说在3.0 beta2版本号 ...

  2. 【oracle案件】ORA-19502,ORA-27072

    1.1.1. ORA-19502,ORA-27072 日期:2014-05-12 00:12 环境:试验机 [错误号] $ oerr ora 19502 19502, 00000, "wri ...

  3. 【Java基金会】Java整理面试问题和评论(一)

    1. ArrayList,Vector, LinkedList 存储性能及特点 ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便添加和插入元素,它们都 ...

  4. Windows Azure应用系列:微软的云部署VPN

    本文介绍如何使用OpenVPN微软云计算server既定VPN维修. 过程,如下面: 1.新建Linux或者Ubuntu虚拟机.并设置port.(本文将建立Ubuntu作为演示) 2.利用PuTTY登 ...

  5. 矩形类定义【C++】

    Description 定义一个矩形类,数据成员包括左下角和右上角坐标,定义的成员函数包括必要的构造函数.输入坐标的函数,以及计算并输出矩形面积的函数.要求使用提示中给出的测试函数并不得改动. Inp ...

  6. 答读者问(8):相关Java问题涉及到学习

    近来的,我收到一个研究生朋友的电子邮件,一般内容如下面: 日 (本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5,我们的聊天号码:245924426.欢 ...

  7. android使用XmlPullParser来解析XML文件

    解析下面的一个XML: <?xml version="1.0" encoding="utf-8" ?> <rss><sid> ...

  8. js比量undefined种类

    js比量undefined种类 if (reValue== undefined) {     alert("undefined"); } 发现推断不出来.最后查了下资料要用type ...

  9. Vim经常使用技巧总结1

    我的主力博客:半亩方塘 1. 反复上次的操作在普通模式下用 . 命令 2. 取消上次的操作在普通模式下用 u 命令 3. 整行删除在普通模式下用 dd 命令,此命令在删除行后 不进入插入模式 4. 整 ...

  10. 买面包和IoC

    今天上午准备去一个阿姨,在那里买面包.这可能是由于小尺寸她的,因此,管理不规范,所以,当你买面包.没有人行.即使所有的大学生,似几乎没有这种意识.. . 但让我感到震惊的是.尽管没有排队,但阿姨似乎能 ...