Jquery中文网 www.jquerycn.cn
Jquery中文网 >  脚本编程  >  javascript  >  正文 JS链式调用的实现方法

JS链式调用的实现方法

发布时间:2014-09-11   编辑:www.jquerycn.cn
在编写js代码时,可以把方法的链式调用技术用到自己所写的JS库中,把自己喜欢的方法串起来调用,是不是很酷呢,快来看看本文介绍的实现方法吧。

1、链式调用
链式调用其实只不过是一种语法招数。它能让你通过重用一个初始操作来达到用少量代码表达复杂操作的目的。
该技术包括两个部分:
一个创建代表HTML元素的对象的工厂。
一批对这个HTML元素执行某些操作的方法。

2、调用链的结构
$函数负责创建支持链式调用的对象
例1,
 

复制代码 代码示例:
(function() {
/*
* 创建一个私有class
* @param {Object} els arguments 所有参数组成的类数组
*/
function _$(els) {
this.elements = []; //存放HTML元素
for(var i=0, len=els.length; i<len; i++) {
var element = els[i];
if(typeof element === 'string') {
element = document.getElementById(element);
}
this.elements.push(element);
}
}
//对HTML元素可执行的操作
_$.prototype = {
each: function() {},
setStyle: function() {},
show: function() {},
addEvent: function() {},
};
//对外开放的接口
window.$ = function() {
return new _$(arguments);
};
})();

3、由于所有对象都会继承其原型对象的属性和方法,所以我们可以让定义在原型对象中的那些方法都返回用以调用方法的实例对象的引用,这样就可以对那些方法进行链式调用了。

例2,
 

复制代码 代码示例:

(function() {
/*
* 创建一个私有class
* @param {Object} els arguments 所有参数组成的类数组
*/
function _$(els) {
//...
}
//对HTML元素可执行的操作
_$.prototype = {
each: function(fn) { //fn 回调函数
for(var i=0; i<this.elements.length; i++) {
//执行len次,每次把一个元素elements[i]作为参数传递过去
fn.call(this, this.elements[i]);
}
return this;
},
setStyle: function(prop, value) {
this.each(function(el) {
el.style[prop] = value;
});
return this;
},
show: function() {
var that = this;
this.each(function(el) {
that.setStyle('display', 'block');
});
return this;
},
addEvent: function(type, fn) {
var addHandle = function(el) {
if(document.addEventListener) {
el.addEventListener(type, fn, false);
}else if(document.attachEvent) {
el.attachEvent('on'+type, fn);
}
};
this.each(function(el) {
addHandle(el);
});
return this;
}
};
//对外开放的接口
window.$ = function() {
return new _$(arguments);
}

})();

//---- test --------
$(window).addEvent('load', function() {
$('test-1', 'test-2').show()
.setStyle('color', 'red')
.addEvent('click', function() {
$(this).setStyle('color', 'green');
});
})

4、链式调用的方法获取数据
使用回调函数从支持链式调用的方法获取数据。链式调用很适合赋值器方法,但对于取值器方法,你可能希望他们返回你要的数据而不是this(调用该方法的对象).解决方案:利用回调技术返回所要的数据.
例3,
 

复制代码 代码示例:
window.API = window.API || function() {
var name = 'mackxu';
//特权方法
this.setName = function(name0) {
name = name0;
return this;
};
this.getName = function(callback) {
callback.call(this, name);
return this;
};
};
//-- test ---
var obj = new API();
obj.getName(console.log).setName('zhangsan').getName(console.log);

5、设计一个支持方法链式调用的JS库
JS库特征:
事件: 添加和删除事件监听器、对事件对象进行规划化处理
DOM: 类名管理、样式管理
Ajax: 对XMLHttpRequest进行规范化处理
例4,
 

复制代码 代码示例:

Function.prototype.method = function(name, fn) {
this.prototype[name] = fn;
return this;
};
(function() {
function _$(els) {
//...
}
/*
* Events
* addEvent
* removeEvent
*/
_$.method('addEvent', function(type, fn) {
//...
}).method('removeEvent', function(type, fn) {

})
/*
* DOM
* addClass
* removeClass
* hover
* hasClass
* getClass
* getStyle
* setStyle
*/
.method('addClass', function(classname) {
//...
}).method('removeClass', function(classname) {
//...
}).method('hover', function(newclass, oldclass) {
//...
}).method('hasClass', function(classname) {
//...
}).method('getClass', function(classname) {
//...
}).method('getStyle', function(prop) {
//...
}).method('setStyle', function(prop, val) {
//...
})
/*
* AJAX
* ajax
*/
.method('ajax', function(url, method) {
//...
});

window.$ = function() {
return new _$(arguments);
};
//解决JS库命名冲突问题
window.installHelper = function(scope, interface) {
scope[interface] = function() {
return _$(arguments)
}
}
})();

总结:
链式调用有助于简化代码的编写工作,并在某种程度上可以让代码更加简洁、易读。
链式调用可以避免多次重复使用一个对象变量,从而减少代码量。
如果想让类的接口保持一致,让赋值器和取值器都支持链式调用,那么可以在取值器中使用回调函数来解决获取数据问题。

您可能感兴趣的文章:
JS链式调用的实现方法
js 控制页面跳转的五种方法
PHP三种方式实现链式操作
JQuery的read函数与js的onload不同方式实现
微信端h5页面如何调用分享页面的接口
jquery链式操作、链式写法的小例子
如何在微信端html5页面调用分享接口
JavaScript继承方式详解
JavaScript 对象链式操作小例子
php链式操作的实现

[关闭]