JavaScript迭代器模式

2020-12-29  本文已影响0人  晓蟲QwQ

迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
如今大部分语言已经内置迭代器的实现,如foreach、for( obj in arr){ }等

无迭代实现不同浏览器环境下上传数据

该方法充斥着try-catch,if-else,使得代码难以阅读,同时严重违反开闭原则。在开发和调试过程中,改动相当痛苦

var getUploadObj = function(){
    try{
        return new ActiveXObject('TXFTNActiveX.FTNUpload');  //IE上传控件
    } catch(e){
        if( supportFlash() ){   //supportFlash函数未提供
            var str = '<object type="application/x-shockwave-flash"></object>';
            return $( str ).appendTo($('body'));
        }else {
            var str = '<input name="file" type="file" />';  //表单上传
            return $(str).appendTo($('body'));
        }
    }
};

使用迭代模式的上传代码

/************* 各个上传方法 **********/
var getActiveUploadObj = function(){
    try{
        return new ActiveXObject('TXFTNActiveX.FTNUpload');  //IE上传控件
    } catch(e){
        return false;
    }
};

var getFlashUploadObj = function(){
    if( supportFlash() ){   //supportFlash函数未提供
        var str = '<object type="application/x-shockwave-flash"></object>';
        return $( str ).appendTo($('body'));
    }
    return false;
}

var getFormUploadObj = function(){
    var str = '<input name="file" type="file" />';  //表单上传
    return $(str).appendTo($('body'));
}

/************** 迭代器代码 ******************/
var iteratorUploadObj = function(){
    for ( var i = 0, fn; fn = arguments[i++];){
        var uploadObj = fn();
        if( uploadObj !== false ){
            return uploadObj;
        }
    }
};

var uploadObj = iteratorUploadObj(getActiveUploadObj, getFlashUploadObj, getFormUploadObj);

这样只需修改iteratorUploadObj的参数顺序,就可以改变调用顺序,而不必改变原整个函数的代码。

上一篇 下一篇

猜你喜欢

热点阅读