链式调用的形式其实就是对象调用一连串的方法。为什么能连续调用这么多的方法?因为调用方法返回调用的对象,于是乎就可以一如既往,一往无前地调用下去。链式调用的原理就是在方法中返回执行上下文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. 【iOS】彩虹渐变色 的 Swift 实现

    首先很感谢大家的支持与关注.<Web Color 的 Swfit 实现>一文一经公布.訪问量迅速攀升,让本人受宠若惊. 为表达感激之情,今天早上把彩虹渐变也顺手实现了. 最新代码& ...

  2. java自学者的福音

    谈到自学对于程序员来说并不陌生,自从我们离开校门就开始了自学之路.这一路上绝大部分都是 百步止于九十 步, 不是因为他们不够坚持,而是没有找到学习的方法和资源.当然这一路上我也走得很辛苦,刚毕业后自学 ...

  3. Ubuntu下安装KDE及安装中文环境

    进入Ubuntu的默认安装的桌面后打开终端,输入 sudo apt-get install kubuntu-desktop 回车后输入密码接下来提示下载KDE需要多少空间,解压后需要多少空间,询问是否 ...

  4. ubuntu 12.04安装经典的Gnome桌面

    这次介绍的是如何在ubuntu 12.04 中安装经典的 GNOME桌面,默认的 Ubuntu 12.04 默认unity桌面,一些用户不喜欢 Unity 桌面,所以想找回昔日的经典Gnome桌面. ...

  5. Javascript 进阶 作用域 作用域链

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/25076713 一直觉得Js很强大,由于长期不写js代码,最近刚好温故温故. 1. ...

  6. 【Web探索之旅】第三部分第二课:IP地址和域名

    内容简介 1.第三部分第二课:IP地址和域名 2.第三部分第三课预告:协议 第三部分第二课:IP地址和域名 上一课我们说了在Web之中,全球各地有无数台机器,有些充当客户机,有些作为服务器. 那么这些 ...

  7. [INS-32052] Oracle基文件夹和Oracle主文件夹位置同样

    1.错误描写叙述 [INS-32052] Oracle基文件夹和Oracle主文件夹位置同样 2.错误原因    Oracle基文件夹和Oracle主文件夹位置同样 3.解决的方法    Oracle ...

  8. [LeetCode228]Summary Ranges

    题目: Given a sorted integer array without duplicates, return the summary of its ranges. For example, ...

  9. HYSBZ 2243 染色 (树链拆分)

    主题链接~~> 做题情绪:这题思路好想.调试代码调试了好久.第一次写线段树区间合并. 解题思路: 树链剖分 + 线段树区间合并 线段树的端点记录左右区间的颜色.颜色数目.合并的时候就用区间合并的 ...

  10. 【C语言探索之旅】 第二部分第六课:创建你自己的变量类型

    内容简介 1.课程大纲 2.第二部分第六课: 创建你自己的变量类型 3.第二部分第七课预告:   文件读写 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C ...