javascript 構(gòu)建模塊化開發(fā)過程解析
在使用 sea.js 、require.js 、 angular 的時候。
我們使用到 define 、 module(require) 的方式,定義模塊,和依賴模塊
下面給出 define 和 module 的簡單實現(xiàn)。 其本質(zhì),就是往一個對象上面添加方法
var F = {}; F.define = function(str,fn){ var parts = str.split("."); var parent = this; // parent 當(dāng)前模塊的父模塊 var i = len = 0; //如果第一個模塊是模塊單體對象,則移除 if(parts[0] == "F"){ parts = parts.slice(1); } //屏蔽對 define module 模塊方法重寫 if(parts[0] == "define" || parts[0] == "module"){ return ; } for(len = parts.length; i < len-1; i++){ //如果父模塊中不存在當(dāng)前模塊 if(typeof parent[parts[i]] === 'undefined'){ //聲明當(dāng)前模塊 parent[parts[i]] = {}; } //緩存下一層父模塊 parent = parent[parts[i]]; } if(fn && parts[i]){ //如果給定模塊方法,則綁定該模塊的方法, parent[parts[i]] = fn(); } return this; } F.module = function(){ var args = [].slice.call(arguments);//復(fù)制參數(shù) var fn = args.pop(); //獲取回調(diào) var parts = args[0] && args[0] instanceof Array ? args[0] : args; //模塊的依賴 var modules = []; //模塊的路由 var modIDs = ""; //依賴模塊的索引 var i = 0; var len = parts.length; // 依賴模塊的長度 var parent,j,jlen; //父級模塊,模塊路由層級索引,模塊路由層級長度 while(i < len){ if(typeof parts[i] == "string"){ parent = this; //解析路由,并且屏蔽掉 F modIDs = parts[i].replace(/^F\./,"").split("."); //遍歷模塊層級 for( j = 0,jlen = modIDs.length; j < jlen; j++){ //迭代 父模塊 parent = parent[modIDs[j]] || false; } modules.push(parent); //將模塊添加到依賴列表 }else{ //直接將模塊添加到依賴列表 modules.push(parts[i]); } //取下一個模塊 i++; } //執(zhí)行回調(diào),將依賴的模塊注入 fn.apply(null,modules); } //定義 string 模塊 F.define("string",function(){ return { trim(str){ return str.replace(/^s+|\s+$/g,""); } } }); //定義 string 模塊,的子模塊 sub F.define("string.sub",function(){ return { low(str){ return str.toLowerCase(); } } }); console.log(F); //使用模塊 F.module(["string","string.sub",document],function(str,strSub,doc){ console.log(str,strSub,doc) });
當(dāng)然了,這里使用的,F(xiàn) 對象,實際應(yīng)用中,應(yīng)該寫在閉包里面。不能讓外界直接訪問,于是有如下代碼。
var Sea = (function(){ var F = {}; F.define = function(str,fn){ var parts = str.split("."); var parent = this; // parent 當(dāng)前模塊的父模塊 var i = len = 0; //如果第一個模塊是模塊單體對象,則移除 if(parts[0] == "F"){ parts = parts.slice(1); } //屏蔽對 define module 模塊方法重寫 if(parts[0] == "define" || parts[0] == "module"){ return ; } for(len = parts.length; i < len-1; i++){ //如果父模塊中不存在當(dāng)前模塊 if(typeof parent[parts[i]] === 'undefined'){ //聲明當(dāng)前模塊 parent[parts[i]] = {}; } //緩存下一層父模塊 parent = parent[parts[i]]; } if(fn && parts[i]){ //如果給定模塊方法,則綁定該模塊的方法, parent[parts[i]] = fn(); } return this; } F.module = function(){ var args = [].slice.call(arguments);//復(fù)制參數(shù) var fn = args.pop(); //獲取回調(diào) var parts = args[0] && args[0] instanceof Array ? args[0] : args; //模塊的依賴 var modules = []; //模塊的路由 var modIDs = ""; //依賴模塊的索引 var i = 0; var len = parts.length; // 依賴模塊的長度 var parent,j,jlen; //父級模塊,模塊路由層級索引,模塊路由層級長度 while(i < len){ if(typeof parts[i] == "string"){ parent = this; //解析路由,并且屏蔽掉 F modIDs = parts[i].replace(/^F\./,"").split("."); //遍歷模塊層級 for( j = 0,jlen = modIDs.length; j < jlen; j++){ //迭代 父模塊 parent = parent[modIDs[j]] || false; } modules.push(parent); //將模塊添加到依賴列表 }else{ //直接將模塊添加到依賴列表 modules.push(parts[i]); } //取下一個模塊 i++; } //執(zhí)行回調(diào),將依賴的模塊注入 fn.apply(null,modules); } return { define:function(){ F.define.apply(F,arguments); }, module:function(){ F.module.apply(F,arguments); } } })(); //定義 string 模塊 Sea.define("string",function(){ return { trim(str){ return str.replace(/^s+|\s+$/g,""); } } }); //定義 string 模塊,的子模塊 sub Sea.define("string.sub",function(){ return { low(str){ return str.toLowerCase(); } } }); console.log(Sea); //使用模塊 Sea.module(["string","string.sub",document],function(str,strSub,doc){ console.log(str,strSub,doc) });
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用JS前端技術(shù)實現(xiàn)靜態(tài)圖片局部流動效果
本文使用前端開發(fā)技術(shù),結(jié)合?SVG?和?CSS?來實現(xiàn)類似的液化流動效果,包含的知識點主要包括:mask-image?遮罩、feTurbulence?和?feDisplacementMap?濾鏡、filter?屬性、canvas?繪制方法、TimelineMax?動畫及input[type=file]?本地圖片資源加載,需要的朋友可以參考下2022-08-08JS 截取字符串substr 和 substring方法的區(qū)別
JS 截取字符串substr 和 substring方法的區(qū)別,需要的朋友可以參考下,根據(jù)需要自行選擇。2009-10-10JavaScript第一個分水嶺之?dāng)?shù)組的基本操作
Arrays(數(shù)組) 數(shù)組是一個固定長度的存儲相同數(shù)據(jù)類型的數(shù)據(jù)結(jié)構(gòu),數(shù)組中的元素被存儲在一段連續(xù)的內(nèi)存空間中,下面這篇文章主要給大家介紹了關(guān)于JavaScript第一個分水嶺之?dāng)?shù)組的基本操作,需要的朋友可以參考下2022-04-04html+css+js實現(xiàn)簡易版ChatGPT聊天機器人
OpenAI的一款聊天機器人模型ChatGPT爆火,本篇文章用一百行html+css+js代碼給大家制作一款簡易的聊天機器人。2023-02-02字節(jié)跳動面試之如何用JS實現(xiàn)Ajax并發(fā)請求控制
這篇文章主要給大家介紹了關(guān)于字節(jié)跳動面試之如何用JS實現(xiàn)Ajax并發(fā)請求控制的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05淺談javascript中的instanceof和typeof
這篇文章主要簡單介紹了javascript中的instanceof和typeof的相關(guān)資料,需要的朋友可以參考下2015-02-02微信小程序事件對象中e.target和e.currentTarget的區(qū)別詳解
這篇文章主要介紹了微信小程序事件對象中e.target和e.currentTarget的區(qū)別詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05