代码改变世界

javascript学习(10)——[知识储备]链式调用

2013-11-18 22:19  低调de草原狼  阅读(159)  评论(0编辑  收藏  举报

上次我们简单的说了下单例的用法,这个也是在我们java中比较常见的设计模式。

今天简单说下链式调用,可能有很多人并没有听过链式调用,但是其实只要我简单的说下的话,你肯定基本上都在用,大家熟知的jQuery中我们通常都是调用完一个函数后,我们直接就继续调用其他函数,而不需要再去new一个新的对象。这就是典型的链式调用。

首先我们列举个例子,说明下并非链式调用,给我们带来的不方便的地方:

/**
 * 从一个实例引出立案时调用的需求
 */
(function(){
	//创建一个cat
	function Cat(name){
		this.name = name;
		this.run = function(){
			document.write(name+ " start run");
		}
		this.stopRun = function(){
			document.write(name+ " stop run");
		}
		this.sing = function(){
			document.write(name+ " start sing");
		}
		this.StopSing = function(){
			document.write(name+ " stop sing");
		}		
	}
	//测试
	var c = new Cat("abc");
	c.run();
	c.sing();
	c.StopSing();
	c.stopRun();
})()

下面我们举个例子说明下链式调用的好处,从而和上边非链式调用做比较:

/**
 * 从一个实例引出立案时调用的需求
 */
(function(){
	//创建一个cat
	function Cat(name){
		this.name = name;
		this.run = function(){
			document.write(name+ " start run");
			return this;
		}
		this.stopRun = function(){
			document.write(name+ " stop run");
			return this;
		}
		this.sing = function(){
			document.write(name+ " start sing");
			return this;
		}
		this.StopSing = function(){
			document.write(name+ " stop sing");
			return this;
		}		
	}
	//测试
	var c = new Cat("abc");
	c.run().stopRun().sing().StopSing();
})()

以上两个例子也比较简单的说明了链式调用和非链式调用的区别。


那么下面我们模仿jquery做一个链式调用的例子:

/**
 * 模仿jquery的链式调用
 */
//为了类(Function)扩展函数,我们定义一个他的静态函数
Function.prototype.method = function(name,fn){
	this.prototype[name] = fn;
	return this;
};
(function(){
	//还记得吗他是私有变量的写法
	function _$(els){};	
	//准备方法
	_$.onready = function(obj,fn){
		if(obj){
			//按需求吧对象(_$)注册到window上
			obj.$ = function(){
				return new _$(arguments);
			}			
		}else{
			//按需求吧对象(_$)注册到window上
			window.$ = function(){
				return new _$(arguments);
			}
		}
		fn();
	}
	//链式的对象增加jquery库提供的操作函数
	_$.method("addEvent",function(type,fn){
		fn();
	}).method("getEvent",function(fn,e){
		fn();
	}).method("addClass",function(className){
		fn();
	}).method("removeClass",function(className){
		fn();
	}).method("replaceClass",function(oldClass,newClass){
		fn();
	}).method("getStyle",function(el,fn){
		fn();
	}).method("setStyle",function(el,fn){
		fn();
	}).method("load",function(url,fn){
		fn();
	});
	//开始使用
	var com = {};
	_$.onready(com,function(){
//		$("div01").addEvent("click",function(){
//			alert("click Event");
//		})
		com.$("div01").addEvent("click",function(){
			alert("click Event");
			com.$(this).getEvent(function(){
				alert("click getEvent");
			})
		})		
	})
})()

上边的例子也简单的说明了下,希望对大家有帮助,有什么问题及时交流。