JavaScript链式调用

方法的链式调用

调用链的结构

对$函数你已经很熟悉了。它通常返回一个html元素或一个html元素的集合,如下:

function$(){
    var elements = [];
    for(vari=0,len=arguments.length;i<len;++i){
          var element = arguments[i];
          if(typeof element ===”string”){
              element = document.getElementById(element);
          }
          if(arguments.length==1){
               return element;
           }
           elements.push(element);
    }
     return elements;
}

但是,如果把这个函数改造为一个构造器,把那些元素作为数组保存在一个实例属性中,并让所有定义在构造器函数的prototype属性所指对象中的方法都返回用以调用方法的那个实例的引用,那么它就具有了链式调用的能力。我首先需要把这个$函数改为一个工厂方法,它负责创建支持链式调用的对象。这个函数应该能接受元素数组形式的参数,以便我们能够使用与原来一样的公用接口。

(function(){

    //use private class
      function _$(els){
        this.elements = [];
         for(vari=0,len=els.length;i<len;i++){
            var element = els[i];
             if(typeof element ===”string”){
                element  = document.getElementById(element);
             }
              this.elements.push(element)
         }
      }
       //The public interface remains the same.

        window.$ = function(){
             return new _$(arguments);
        }
})();

由于所有对象都会继承其原型对象的属性和方法,所以我们可以让定义在原型对象中的那几个方法都返回用以调用方法的实例对象的引用,这样就可以对那些方法进行链式调用。想好这一点,我们现在就动手在_$这个私用构造函数的prototype对象中添加方法,以便实现链式调用

(function(){

    //use private class

    function _$(els){
        //..省略之前上面的代码
    }

    _$.prototype = {
        each:function(fn){
            for(var i=0,len=this.elements.length;i<len;i++){
                fn.call(this,this.elements[i]);
            }
            return this;
        },

        show:function(prop,val){
            var that = this;
            this.each(function(el){
               that.setStyle("display”,”block");
            });
            return this;
        },

        addEvent:function(type,fn){
           var add = function(el){
               if(window.addEventListener){
                  el.addEventListener(type,fn,false);
               }else if(window.attachEvent){
                  el.attachEvent("on"+type,fn);
               }
           };

            this.each(function(el){
               add(el);
            });
            return this;
        }
    };

    //The public interface remains the same.

    window.$ = function(){
        return new _$(arguments);
    }

})();

但是如果某个库或者框架已经定义了一个$函数,那么我们的这个库会将其改写,有个简单的办法是在源码中为$函数另去一个名字。但是如果你是从一个现有的库获得的源码,那么每次代码库获取更新的版本后 你都得重新改名字,因此这个方案并不是很好。好的解决办法就是像下面一样添加一个安装器:

window.installHelper = function(scope, interface) {
    scope[interface] = function() {
      return new _$(arguments);
    }
  };

用户可以这样去使用:

installHelper(window, ‘$‘);
$(‘example‘).show();

下面是一个更复杂的例子,它展示了如何把这种功能添加到一个事先

时间: 2024-08-29 00:43:30

JavaScript链式调用的相关文章

JavaScript 链式调用

我们使用jquery的时候,jquery的简单的语法及可实现链式调用方法,现在我们自己也封装一个链式调用的方法,来理解下 jquery中如何封装链式调用 无非就是每次调用一个方法的时候 给这个方法返回this即可,this指向该对象自身,我们看看代码: 1 // 定义一个简单的对象,每次调用对象的方法的时候,该方法都返回该对象自身 2 var obj = { 3 a: function(){ 4 console.log("输出a"); 5 return this; 6 }, 7 b:f

关于JavaScript中的setTimeout()链式调用和setInterval()探索

http://www.cnblogs.com/Wenwang/archive/2012/01/06/2314283.html http://www.cnblogs.com/yangjunhua/archive/2012/04/12/2444106.html 下面的参考:http://evantre.iteye.com/blog/1718777 1.选题缘起 在知乎上瞎逛的时候看到一个自问自答的问题: 知乎上,前端开发领域有哪些值得推荐的问答?,然后在有哪些经典的 Web 前端或者 JavaScr

JavaScript设计模式-8.链式调用

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>javascript高级语法8-链式调用</title> 6 </head> 7 <body> 8 <div id="box"></div> 9 <script type="text/javas

javascript设计模式 第6章 链式调用

链式调用是一种语法招数.作用:能让你通过重用一个初始化操作来达到用少量代码表达复杂操作的目的.. 这种技术包含两个部分: 1.一个创建代表html元素的对象的工厂.以及一批对这个html元素执行某些操作的方法. 通过例子对比:之前和之后的代码,对链式调用的概念的初步认识.  之前:   addevent($('example'),"click",function(){    setstyle(this,"color",'green');    show(this);

JavaScript设计模式——方法的链式调用

方法的链式调用: 1 (function() { 2 //私有类 3 function _$ (els) { 4 this.elements = []; 5 for(var i = 0, len = els.length; i < len; ++i){ 6 var element = els[i]; 7 if(typeof element === 'string'){ 8 element = document.getElementById(element); 9 } 10 this.elemen

链式调用

链式调用 不论是JavaScript还是C#程序,我们已经习惯了采用如下所示的"链式调用"的方式进行编程,这样确实会使我们的程序变得很精练. 1: new Foo() 2: .UseXxx() 3: .UseZzz() 4: .UseZzz() 5: .Invoke(); 采用这种链式调用方式的很多方法都是扩展方法,比如上面所示的UseXxx.UseYyy和UseXxx方法就是采用如下形式定义的扩展方法. 1: public interface IFoo 2: { 3: void In

面向对象的链式调用

1. 对象的链式调用 function Chain(){ this.n=0;//属性不一定一开始的时候全部都要初始化 this.fn1=function(_obj){//this指向  new Chain()实例化的对象 alert(this.n++);//注意:alert(this.n++)与this.fn1中的this 不一定指向的对象是一样的 return this; } this.fn2=function(){//同上 alert(this.n++);//注意:alert(this.n+

进击的雨燕-------------可空链式调用

详情转自:http://wiki.jikexueyuan.com/project/swift/chapter2/07_Closures.html 可空链式调用(Optional Chaining)是一种可以请求和调用属性.方法及下标的过程,它的可空性体现于请求或调用的目标当前可能为空(nil).如果可空的目标有值,那么调用就会成功:如果选择的目标为空(nil),那么这种调用将返回空(nil).多个连续的调用可以被链接在一起形成一个调用链,如果其中任何一个节点为空(nil)将导致整个链调用失败.

在python中实现链式调用

用过jquery的一般都知道在jquery中可以链式调用,代码简洁优雅.比如$("a").addClass("test").show().html("foo");. 在redis-py中的pipeline中也可以链式调用,比如pipe.set('foo', 'bar').sadd('faz', 'baz').incr('auto_number').execute() . 那么究竟怎么实现的呢? 很简单,返回对象自己就行了,即return self