zoukankan      html  css  js  c++  java
  • javascript学习(10)——[知识储备]链式调用

    上次我们简单的说了下单例的用法,这个也是在我们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");
    			})
    		})		
    	})
    })()
    

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

  • 相关阅读:
    C# 实现 Snowflake算法生成唯一性Id
    kafka可视化客户端工具(Kafka Tool)的基本使用(转)
    docker 安装kafka
    Model类代码生成器
    使用docker 部署rabbitmq 镜像
    Vue 增删改查 demo
    git 提交代码到库
    Android ble蓝牙问题
    mac 配置 ssh 到git (Could not resolve hostname github.com, Failed to connect to github.com port 443 Operation timed out)
    okhttp
  • 原文地址:https://www.cnblogs.com/riasky/p/3430692.html
Copyright © 2011-2022 走看看