チェーンコールの方法

12429 ワード

javascriptチェーンの呼び出し方法は、有用な小テクニックです.大量のコードを節約できます.次の例を見てください.
(function(arg){
            alert(arg)
            return arguments.callee;
        })('   ')('   ')
もちろん、方法を加えて、次のように拡張できます.
(function(fn,arg){
            var args = Array.prototype.slice.call(arguments);
            args.shift().apply(null,args);
            return arguments.callee;
        })(function(a,b){alert(a+b)},3,5)(function(a,b){alert(a-b)},12,5)
チェーン式のツール関数を作ることができます.
function chain(obj){
    return function(){
        var Self = arguments.callee; Self.obj = obj;
        if(arguments.length==0){
            return Self.obj;
        } 
        Self.obj[arguments[0]].apply(Self.obj,[].slice.call(arguments,1));
        return Self;
    }
}

//   function/ ClassB
function ClassB(){
    this.prop1 = null;
    this.prop2 = null;
    this.prop3 = null;
}
ClassB.prototype = {
    method1 : function(p1){
        this.prop1 = p1;
    },
    method2 : function(p2){
        this.prop2 = p2;
    },
    method3 : function(p3){
        this.prop3 = p3;
    }
}

var obj = new ClassB();
    chain(obj).('method1',4).('method2',5).('method3',6)
もし相手に対して、私達はこうすることができます.
<div id="test"></div>
    <script>
            
        var $ = function(id){
                this.element = document.getElementById(id);
            }
            
            $.prototype = {
                constructor : $,
                show : function(){
                    setTimeout(function(){console.log('show')},1000);
                    return this;
                },
                hide : function(){
                    setTimeout(function(){console.log('hide')},2000);
                    return this;
                }
            }
            
            new $('test').show().hide();
            
    </script>
 倉庫から簡略化したチェーンコールをもう一つ見てください.
(function(){
    function extend(obj){
        (function(){
        //
        this.append=function(obj){
            this.appendChild(obj);
            return this;
        }
        //
        this.appendTo=function(obj){
            obj.appendChild(this);
            return this;
        }
        //
        this.attr=function(a,b){
            if(a instanceof Object){
                for(var x in a){
                    this.setAttribute(x,a[x]);
                }
            }else{
                this.setAttribute(a,b);
            }
            return this;
        }
        //
        this.css=function(a,b){
            if(a instanceof Object){
                for(var x in a){
                    this.style[x]=a[x];
                }
            }else{
                this.style[a]=b;
            }
            return this;
        }
        
        //
        this.html=function(str){
            if( typeof str =='undefined'){
                return this.innerHTML;
            }
            this.innerHTML=str;
            return this;
        }
        }).apply(obj);
        
        return obj;
    }
    window.$c=function(str){
        return extend(document.createElement(str));
    }
})();

$c('div').appendTo(document.body).attr('name','testName').html('ddddd').css('color','#f00')