仿jQuery之链式调用
链式调用的形式其实就是对象调用一连串的方法。为什么能连续调用这么多的方法?因为调用方法返回调用的对象,于是乎就可以一如既往,一往无前地调用下去。链式调用的原理就是在方法中返回执行上下文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之链式调用的更多相关文章
- jquery之链式调用,层级菜单
一. 链式调用的含义 jquery对象的方法会在执行完后返回这个jquery对象,所有jquery对象的方法可以连起来写: $('#div1') // id为div1的元素 .children('ul ...
- Javasript设计模式之链式调用
写过jquery的可能都知道,jquery里面可以很方便的使用以下代码: // 不使用链式调用 const element = $(ele); element.addClass('red'); ele ...
- spring aop 之链式调用
关关雎鸠,在河之洲.窈窕淑女,君子好逑. 概述 AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横 ...
- Jquery复习(三)之链式调用
通过 jQuery,可以把动作/方法链接在一起. Chaining 允许我们在一条语句中运行多个 jQuery 方法(在相同的元素上). jQuery 方法链接 直到现在,我们都是一次写一条 jQue ...
- 深入了解jQuery之链式结构
本文是在阅读了Aaron艾伦的jQuery源码解析(地址:http://www.imooc.com/learn/172)后的个人体会以及笔记.在这里感谢艾伦老师深入浅出的讲解!! 1 什么是链式? 先 ...
- mark jquery 链式调用的js原理
我们在使用jquery的时候会用到类似$("#id").css('color','red').show(200); 这样写有点减少代码量,减少了逐步查询DOM的性能损耗: js 原 ...
- jQuery链式调用
<script> var arr = function(){ return new arr.prototype.init(); } arr.prototype.init = functio ...
- jQuery之链式编程
使用的思想:隐式迭代. <button>快速</button> <button>快速</button> <button>快速</but ...
- JavaScript设计模式-8.链式调用
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
随机推荐
- libyuv编
下载代码(墙): git clone http://git.chromium.org/external/libyuv.git 用 make 编译(linux.mingw.cygwin): mak ...
- 执行Sql块
import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import oracle.C ...
- 阿赫亚web安全JSON
前言 JSON(JavaScript Object Notation),可以说,这一事实,浏览器,server数据交换标准.的格式如XML,或者其他自己定义的格式会越来越少. 为什么JSON这么流行? ...
- POJ 3450 Corporate Identity KMP解决问题的方法
这个问题,需要一组字符串求最长公共子,其实灵活运用KMP高速寻求最长前缀. 请注意,意大利愿父亲:按照输出词典的顺序的规定. 另外要提醒的是:它也被用来KMP为了解决这个问题,但是很多人认为KMP使用 ...
- VS2012的变态优化,双循环变单循环
VS2010也是一样
- cocos2d-x3.0数据结构
1.cocos2d::Vector 1.头报价"CCVector.h"头文件. 2.保存的数据类型必须是cocos2d::Ref的子类. 3.实现是动态加入数据集合即链表.主要的使 ...
- 前端构建工具gulp
前端构建工具gulp使用 前端自动化流程工具,用来合并文件,压缩等. Gulp官网 http://gulpjs.com/ Gulp中文网 http://www.gulpjs.com.cn/ Gul ...
- WPF中的三维空间(1)
原文:WPF中的三维空间(1) WPF中可以创建三维几何图形,支持3D对象的应用,支持从3D Max等软件将3D文件obj导入设计中,但是目前还不支持将材质同时导入,这样需要在WPF中对3D对象重新设 ...
- Python 清理HTML标签相似PHP的strip_tags函数功能(二)
没有发现Python 有现成的类似功能模块,所以昨天写了个简单的 strip_tags 但还有些问题,今天应用到採集上时进行了部分功能的完好, 1. 对自闭和标签处理 2. 以及对标签參数的过滤 fr ...
- 安装nodejs搭建ghost个人博客
记录一下今天在linux下折腾nodejs的过程,相互学习: (不知道为什么用源代码安装,调用npm的时候老是会出现找不到npmlog的 错误,后来换用下了个二进制 来搞,假设那个牛牛知道为什么.希望 ...