zoukankan      html  css  js  c++  java
  • js实现reqire中的amd,cmd功能

    js实现reqire中的amd,cmd功能 ,大概实现了 路径和模块 引入等重要功能。 本帖属于原创,转载请出名出处。

     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>无标题文档</title>
    </head>
     <body>
     <script>
      
     
     /*
      原生js 实现 require Cmd Amd 功能
      作者:姚观寿
     */
     (function( root, factory ) {
     var modules = {},
    
            // 内部require  。
             _require = function( deps, callback ) {
                var args, len, i;
                // 如果deps不是数组,则直接返回指定module
                if ( typeof deps === 'string' ) {
                    return getModule( deps );
                } else {
                    args = [];
                    for( len = deps.length, i = 0; i < len; i++ ) {
                        args.push( getModule( deps[ i ] ) );
                    }
    
                    return callback.apply( null, args );
                }
            },
    
            // 内部define,暂时不支持不指定id.
            _define = function( id, deps, factory ) {
                if ( arguments.length === 2 ) {
                    factory = deps;
                    deps = null;
                }
    
                _require( deps || [], function() {
                    setModule( id, factory, arguments );
                });
            },
    
            // 设置module, 兼容CommonJs写法。
            setModule = function( id, factory, args ) {
                var module = {
                        exports: factory
                    },
                    returned;
    
                if ( typeof factory === 'function' ) {
                    args.length || (args = [ _require, module.exports, module ]);
                    returned = factory.apply( null, args );
                    returned !== undefined && (module.exports = returned);
                }
    
                modules[ id ] = module.exports;
            },
    
            // 根据id获取module
            getModule = function( id ) {
                var module = modules[ id ] || root[ id ];
    
                if ( !module ) {
                    throw new Error( '`' + id + '` is undefined' );
                }
    
                return module;
            },
    
            // 将所有modules,将路径ids装换成对象。
            exportsTo = function( obj ) {
    			 
                var key, host, parts, part, last, ucFirst,obj=obj||{};
    
                 ucFirst = function( str ) {
                    return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
                };
                 for ( key in modules ) {
                    host = obj;
     				
                     if ( !modules.hasOwnProperty( key ) ) {
                        continue;
                    }
    
                    parts = key.split('/');
                    last = ucFirst( parts.pop() );
    
                    while( (part = ucFirst( parts.shift() )) ) {
                        host[ part ] = host[ part ] || {};
                        host = host[ part ];
                    }
    		 
                    host[ last ] = modules[key];
    			  
                }
    
                return obj;
            },
    
            makeExport = function(   ) {
               // root.__dollar = dollar||'';
    
                 return exportsTo( factory( root,_define, _require ) );
            },
    
    				origin,
    				arr,
    				pattern = new RegExp(/(.+)/, "igm"),
    				str = factory.toString().match(pattern);
    				str = str[0].replace(/s/g, "");
    				str = str.substring(1, str.toString().length - 1);
    				arr = str.split(',');
        if ( typeof module === 'object' && typeof module.exports === 'object' ) {
              module.exports = makeExport();   
        } else if ( typeof define === 'function' && define.amd ) {
    
             define([  ], makeExport );    
        } else {
       	      
                   root[arr[3]] = makeExport()||{};
         }
    	
     }
                                                                             //这里最后一个参数是插件名称  这样window 上面就能用了
     )(window, function( window,define, require, carousel ) {
    
    //定义模块
      define('setId',[],function() {
     		   return function(id){
    			        this.id=id;
    			 }
        });  
    	//定义模块
       define('getId',[],function() {
          
             return    function(){
    			         console.log("id:"+this.id);
    			 }
        }); 
    
    
    //定义模块
    	define('getAge',[],function() {
         
             return  function(){
    			    console.log("age:"+this.age);
    			}
        }); 
    	
    	
    
    
    //定义模块 合并
    define('merge',['setId','getId','getAge'],function(setId,getId,getAge) {
              
      				  return {
    								getId:getId,
    								setId:setId,
    								getAge:getAge
    					  };
        }); 
    		
    	
    //定义插件 或者组件构造函数	 
     define('_carousel',['merge'],function(merge) {
              
              function  _carousel(age){
    			              this.age=age;
     			}
    				 _carousel.prototype=merge;
     			  return   _carousel;
        });   
      
     	 return  require('_carousel');
     });
      var _carousel=new  carousel('25')
       _carousel.getAge();
       _carousel.setId(30);
       _carousel.getId();
     </script>
    </body>
    </html>
    

      

  • 相关阅读:
    计算JensenShannon Divergence距离的方法
    perl 取出正则表达式的匹配位置
    QQ客服左右提示
    JS获取DropDownList的value值与text值
    一个大文件上传组件RadUpLoad(带进度条时间显示)
    asp.net不同后辍名的文件
    RowDataBound事件 .
    当sql2000和sql2005同时装时,因为都用了1433的端口号,可能会导致连接失败,这里讲asp.net 的连接方法 .
    CSS圆角
    ASP.NET把图片存入数据库和使用文件流读取显示(转)
  • 原文地址:https://www.cnblogs.com/hao123456/p/8469962.html
Copyright © 2011-2022 走看看