亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript命名空間模式實例詳解

2019-11-19 11:18:28
字體:
來源:轉載
供稿:網友

本文實例講述了JavaScript命名空間模式。分享給大家供大家參考,具體如下:

前言

命名空間可以被認為是唯一標識符下代碼的邏輯分組。為什么會出現命名空間這一概念呢?因為可用的單詞數太少,并且不同的人寫的程序不可能所有的變量都沒有重名現象。在JavaScript中,命名空間可以幫助我們防止與全局命名空間下的其他對象或變量產生沖突。命名空間也有助于組織代碼,有更強的可維護性和可讀性。本文旨在探討JavaScript里的幾種常見命名空間模式,為我們提供一個思路。

JavaScript執行環境有很多獨特之處,全局變量和函數的使用就是其中之一。JavaScript的執行環境由各種各樣的全局變量構成,這些全局變量先于函數執行環境而創建。這些全局變量都掛載于“全局對象”下,在瀏覽器中,window對象就等同于全局對象。那么,在全局作用域中聲明的任何變量和函數都是window對象的屬性,當名稱有沖突時,就會產生一些不可控的問題。全局變量會帶來以下問題:

命名沖突

代碼的脆弱性

難以測試

在編程開發中合理的使用命名空間,可以避免相同的變量或對象名稱產生的沖突。而且,命名空間也有助于組織代碼,有更強的可維護性和可讀性。JavaScript中雖然沒有提供原生的命名空間支持,但我們可以使用其他的方法(對象和閉包)實現類似的效果。下面就是一些常見的命名空間模式:

1.單一全局變量

JavaScript中一個流行的命名空間模式是選擇一個全局變量作為主要的引用對象。因為每個可能的全局變量都成為唯一全局變量的屬性,也就不用再創建多個全局變量,那么也就避免了和其他聲明的沖突。

單一全局變量模式已經在不少的JavaScript類庫中使用,如:

  • YUI定義了唯一的YUI全局對象
  • jQuery定義了和jQuery,和jQuery,由其他類庫使用時使用jQuery
  • Dojo定義了一個Dojo全局變量
  • Closure類庫定義了一個goog全局對象
  • Underscore類庫定義了一個_ 全局對象

示例如下:

var myApplication = (function() {  function() {    // ***  },  return {    // **  }})();

雖然單一全局變量模式適合某些情況,但其最大的挑戰是確保單一全局變量在頁面中是唯一使用的,不會發生命名沖突。

2.命名空間前綴

命名空間前綴模式其思路非常清晰,就是選擇一個獨特的命名空間,然后在其后面聲明聲明變量、方法和對象。示例如下:

var = myApplication_propertyA = {};var = myApplication_propertyA = {};function myApplication_myMethod() {  // ***}

從某種程度上來說,它確實減少了命名沖突的發生概率,但其并沒有減少全局變量的數目。當應用程序規模擴大時,就會產生很多的全局變量。在全局命名空間內,這種模式對其他人都沒有使用的這個前綴有很強的依賴,而且有些時候也不好判斷是否有人已經使用某個特殊前綴,在使用這種模式時一定要特別注意。

3.對象字面量表示法

對象字面量模式可以認為是包含一組鍵值對的對象,每一對鍵和值由冒號分隔,鍵也可以是代碼新的命名空間。示例如下:

var myApplication = {  // 可以很容易的為對象字面量定義功能  getInfo:function() {    // ***  },  // 可以進一步支撐對象命名空間  models:{},  views:{    pages:{}  },  collections:{}};

與為對象添加屬性一樣,我們也可以直接將屬性添加到命名空間。對象字面量方法不會污染全局命名空間,并在邏輯上協助組織代碼和參數。并且,這種方式可讀性和可維護性非常強,當然我們在使用時應當進行同名變量的存在性測試,以此來避免沖突。下面是一些常用的檢測方法:

var myApplication = myApplication || {};if(!myApplication) {  myApplication = {};}window.myApplication || (window.myApplication || {});// 針對jQueryvar myApplication = $.fn.myApplication = function() {};var myApplication = myApplication === undefined ? {} :myApplication;

對象字面量為我們提供了優雅的鍵/值語法,我們可以非常便捷的組織代碼,封裝不同的邏輯或功能,而且可讀性、可維護性、可擴展性極強。

4.嵌套命名空間

嵌套命名空間模式可以說是對象字面量模式的升級版,它也是一種有效的避免沖突模式,因為即使一個命名空間存在,它也不太可能擁有同樣的嵌套子對象。示例如下:

var myApplication = myApplication || {};// 定義嵌套子對象myApplication.routers = myApplication.routers || {};myApplication.routers.test = myApplication.routers.test || {};

當然,我們也可以選擇聲明新的嵌套命名空間或屬性作為索引屬性,如:

myApplication['routers'] = myApplication['routers'] || {};

使用嵌套命名空間模式,可以使代碼易讀且有組織性,而且相對安全,不易產生沖突。其弱點是,如果我們的命名空間嵌套過多,會增加瀏覽器的查詢工作量,我們可以把要多次訪問的子對象進行局部緩存,以此來減少查詢時間。

5.立即調用的函數表達式

立即調用函數(IIFE)實際上就是匿名函數,被定義后立即被調用。在JavaScript中,由于變量和函數都是在這樣一個只能在內部進行訪問的上下文中被顯式地定義,函數調用提供了一種實現私有變量和方法的便捷方式。IIFE是用于封裝應用程序邏輯的常用方法,以保護它免受全局名稱空間的影響,其在命名空間方面也可以發揮其特殊的作用。示例如下:

// 命名空間和undefined作為參數傳遞,確保:// 1.命名空間可以在局部修改,不重寫函數外部上下文// 2.undefined 的參數值是確保undefined,避免ES5規范里定義的undefined(function (namespace, undefined) {// 私有屬性var foo = "foo";  bar = "bar";// 公有方法和屬性namespace.foobar = "foobar";namespace.sayHello = function () {  say("Hello World!");};// 私有方法function say(str) {  console.log("You said:" + str);};})(window.namespace = window.namespace || {});

可擴展性是任何可伸縮命名空間模式的關鍵,使用IIFE可以輕松實現這一目的,我們可以再次使用IIFE給命名空間添加更多的功能。

6.命名空間注入

命名空間注入是IIFE的另一個變體,從函數包裝器內部為一個特定的命名空間“注入”方法和屬性,使用this作為命名空間代理。這種模式的優點是可以將功能行為應用到多個對象或命名空間。示例如下:

var myApplication = myApplication || {};myApplication.utils = {};(function () {  var value = 5;  this.getValue = function () {    return value;  }  // 定義新的子命名空間  this.tools = {};}).apply(myApplication.utils);(function () {  this.diagnose = function () {    return "diagnose";  }}).apply(myApplication.utils.tools);// 同樣的方式在普通的IIFE上擴展功能,僅僅將上下文作為參數傳遞并修改,而不是僅僅使用this

還有一種使用API來實現上下文和參數自然分離的方法,該模式感覺更像是一個模塊的創建者,但作為模塊,它還提供了一個封裝解決方案。示例如下:

var ns = ns || {},  ns1 = ns1 || {};// 模塊、命名空間創建者var creator = function (val) {  var val = val || 0;  this.next = function () {    return val ++ ;  };  this.reset = function () {    val = 0;  }}creator.call(ns);// ns.next, ns.reset 此時已經存在creator.call(ns1, 5000);// ns1包含相同的方法,但值被重寫為5000了

命名空間注入是用于為多個模塊或命名空間指定一個類似的功能基本集,但最好是在聲明私有變量或者方法時再使用它,其他時候使用嵌套命名空間已經足以滿足需要了。

7.自動嵌套的命名空間

嵌套命名空間模式可以為代碼單元提供有組織的結構層級,但每次創建一個層級時,我們也得確保其有相應的父層級。當層級數量很大時,會給我們帶來很大的麻煩,我們不能快速便捷的創建想創建的層級。那么如何解決這個問題呢?Stoyan Stefanov提出,創建一個方法,其接收字符串參數作為一個嵌套,解析它,并自動用所需的對象填充基本名稱空間。下面是這種模式的一種實現:

function extend(ns, nsStr) {  var parts = nsStr.split("."),    parent = ns,    pl;  pl = parts.length;  for (var i = 0; i < pl; i++) {    // 屬性如果不存在,則創建它    if (typeof parent[parts[i]] === "undefined") {      parent[prats[i]] = {};    }    parent = parent[parts[i]];  }  return parent;}// 用法var myApplication = myApplication || {};var mod = extend(myApplication, "module.module2");

以前我們必須為其命名空間將各種嵌套顯式聲明為對象,現在用上述更簡潔、優雅的方式就實現了。

更多關于JavaScript相關內容可查看本站專題:《JavaScript常用函數技巧匯總》、《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》及《JavaScript數學運算用法總結

希望本文所述對大家JavaScript程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品成人一区二区三区吃奶| 欧美乱大交xxxxx另类电影| 中文字幕亚洲欧美日韩在线不卡| 欧美精品中文字幕一区| 国产精品久久久久久久久借妻| 亚洲无亚洲人成网站77777| 欧美激情亚洲另类| 国产精品久久综合av爱欲tv| 久久久久久有精品国产| 欧美一区第一页| 亚洲国产精品久久久久久| 668精品在线视频| 亚洲人成亚洲人成在线观看| 亚洲欧美中文日韩在线| 亚洲视频欧洲视频| 国产福利精品在线| 亚洲欧美精品在线| 久久99亚洲精品| 51午夜精品视频| 国产精品第8页| 国内精品伊人久久| 精品五月天久久| 国产美女久久精品| 九色精品免费永久在线| 亚洲va电影大全| 成人综合网网址| 神马久久桃色视频| 2019亚洲日韩新视频| 精品福利樱桃av导航| 一色桃子一区二区| 国产精品无av码在线观看| 亚洲欧美精品伊人久久| 成人黄色激情网| 国产精品三级网站| 国产97在线亚洲| 最近中文字幕2019免费| 欧美亚洲一级片| 日韩av在线一区| 精品国产依人香蕉在线精品| 中文字幕亚洲欧美日韩2019| 欧美黄色片免费观看| 久久香蕉国产线看观看av| 亚洲国产精品电影| 亲爱的老师9免费观看全集电视剧| 国产91成人video| 国产成人精品综合久久久| 这里只有精品视频在线| 国产综合在线看| 成人精品久久久| 欧美午夜激情在线| 91午夜在线播放| 日韩欧美亚洲综合| 色777狠狠综合秋免鲁丝| 51视频国产精品一区二区| 亚洲变态欧美另类捆绑| 国产精品第七影院| 日韩av电影在线免费播放| 亚洲成人三级在线| 精品国产一区久久久| 深夜福利国产精品| 欧美日韩福利视频| 精品国产乱码久久久久久虫虫漫画| 久久国产天堂福利天堂| 中文字幕日韩电影| 日韩av在线免费播放| 91精品在线国产| 91色琪琪电影亚洲精品久久| 国产精品流白浆视频| 亚洲天堂av在线播放| 久久亚洲综合国产精品99麻豆精品福利| 精品一区二区三区三区| 日韩在线视频观看正片免费网站| 久久久女女女女999久久| 97超碰蝌蚪网人人做人人爽| 久久精视频免费在线久久完整在线看| 国产视频久久久久| 国产99视频在线观看| 粉嫩av一区二区三区免费野| 成人写真视频福利网| 亚洲美女喷白浆| 亚洲国产精品久久久久秋霞不卡| 亚洲人a成www在线影院| 久久国产精品视频| 久久国产加勒比精品无码| 久久久久久久久久久免费精品| 亚洲色图35p| 亚洲精品久久久久久久久久久| 国产一区二中文字幕在线看| 91高清视频在线免费观看| 91av在线免费观看视频| 国产成人精品国内自产拍免费看| 国产精品网址在线| 奇门遁甲1982国语版免费观看高清| 欧美性猛交xxxx偷拍洗澡| 正在播放亚洲1区| 国产丝袜精品视频| 伊是香蕉大人久久| 成人午夜激情免费视频| 亚洲欧美日韩直播| 韩剧1988在线观看免费完整版| 色偷偷91综合久久噜噜| 国产99久久精品一区二区永久免费| 欧美日韩另类字幕中文| 欧美放荡办公室videos4k| 亚洲视频在线免费看| 亚洲国产日韩欧美在线动漫| 欧美xxxx做受欧美| 欧美一区二区大胆人体摄影专业网站| 国产精品在线看| 久久久精品久久久久| 狠狠躁夜夜躁久久躁别揉| 国产精品久久久久久久久借妻| 国产精品吴梦梦| 91啪国产在线| 欧美激情日韩图片| 久久精品久久久久久国产 免费| 免费av一区二区| 亚洲天天在线日亚洲洲精| 亚洲精品91美女久久久久久久| 日韩电影在线观看中文字幕| 亚洲精品美女久久久| 国产成人久久精品| 国产精品96久久久久久| 国产午夜精品视频免费不卡69堂| 毛片精品免费在线观看| 精品毛片三在线观看| 欧美日本亚洲视频| 最新国产精品拍自在线播放| 中文字幕精品—区二区| 国产精品一区二区久久精品| 欧美在线观看网站| 亚洲精品不卡在线| 欧美激情在线观看视频| 欧美国产精品日韩| 精品国产91乱高清在线观看| 97视频在线免费观看| 欧美大全免费观看电视剧大泉洋| 成人国内精品久久久久一区| 欧美日韩国产丝袜美女| 欧美性猛交xxxx富婆弯腰| 亚洲视频第一页| 日韩成人中文字幕在线观看| 欧美日韩在线视频首页| 久久躁日日躁aaaaxxxx| 亚洲一区国产精品| 在线视频中文亚洲| 美女精品久久久| 精品国产一区二区三区四区在线观看| 亚洲高清一二三区| 久久偷看各类女兵18女厕嘘嘘| 亚洲自拍av在线| 国产精品视频1区| 亚洲成av人影院在线观看| 国产亚洲视频在线观看| 国产精品成人国产乱一区| 欧美成在线观看| 亚洲国产成人在线视频| 日韩av片电影专区| 欧美视频中文在线看| 色无极影院亚洲| 亚洲欧洲av一区二区| 97国产成人精品视频| 欧美午夜激情在线| 国产精品久久久久久五月尺|