最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javascript模塊模式分析

 更新時(shí)間:2008年05月16日 22:10:54   作者:  
javascritp模式講解全局變量是魔鬼。在YUI中,我們僅用兩個(gè)全局變量:YAHOO和YAHOO_config。YUI的一切都是使用YAHOO對(duì)象級(jí)的成員或這個(gè)成員作用域內(nèi)的變量。我們建議在你的應(yīng)用程序也使用類似的規(guī)則。
Douglas Crockford已經(jīng)傳授了一個(gè)有用的單例模式(singleton pattern)實(shí)現(xiàn)此規(guī)則,我認(rèn)為他的模式有益于你基于YUI的那些應(yīng)用。Douglas叫它模塊模式(module pattern)。它是如下工作的:

創(chuàng)建一個(gè)命名空間對(duì)象:如果你使用YUI,可以用YAHOO.namespace()方法: YAHOO.namespace("myProject");這分配了一個(gè)空的myProject對(duì)象,是YAHOO的一個(gè)成員(如 果myProject已存在的話,則不會(huì)被覆蓋)?,F(xiàn)在我們可以開始添加YAHOO.myProject的成員。 
對(duì)你的命名空間對(duì)象分配一個(gè)匿名函數(shù)返回值: 
YAHOO.myProject.myModule = function () {
return  {
  myPublicProperty: "我作為YAHOO.myProject.myModule.myPublicProperty被訪問。";
  myPublicMethod: function () {
    YAHOO.log("我作為YAHOO.myProject.myModule.myPublicMethod被訪問。");
  }
};
}(); // 這個(gè)括號(hào)導(dǎo)致匿名函數(shù)被執(zhí)行且返回

注意有閉合大括號(hào)和緊接著的括號(hào)()的最后一行—這種符號(hào)導(dǎo)致了匿名函數(shù)的立即執(zhí)行,返回包含myPublicProperty和myPublicMethod的對(duì)象。只要這個(gè)匿名函數(shù)一返回,返回對(duì)象就作為YAHOO.myProject.myModule被訪問。 

在匿名函數(shù)中,在返回語句前加入“私有”方法和變量。到目前為止,我們只是將myPublicProperty和myPublicMethod直接分配到Y(jié)AHOO.myProject.myModule中。此外,當(dāng)我們?cè)诜祷卣Z句之前放置一些代碼時(shí),這個(gè)模式還支持被增加的效用。 
YAHOO.myProject.myModule = function () {
//“私有”變量:
var myPrivateVar = “我僅能在YAHOO.myProject.myModule內(nèi)被訪問。”;
//私有方法:
var myPrivateMethod = function () {
    YAHOO.log(”我僅能在YAHOO.myProject.myModule內(nèi)被訪問?!?;
}

return  {
    myPublicProperty: “我作為YAHOO.myProject.myModule.myPublicProperty能被訪問。”
    myPublicMethod: function () {
    YAHOO.log(”我作為YAHOO.myProject.myModule.myPublicMethod能被訪問?!?;
    //在myProject,我能訪問私有的變量和方法
    YAHOO.log(myPrivateVar);
    YAHOO.log(myPrivateMethod());
    //myPublicMethod的原生作用域是myProject,我們可以用“this”來訪問公共成員。
    YAHOO.log(this.myPublicProperty);
    }
};
}();
在上面的代碼中,我們從一個(gè)匿名函數(shù)返回有兩個(gè)成員的一個(gè)對(duì)象。在YAHOO.myProject.myModule內(nèi)部,可以分別用this.myPublicProperty和this.myPublicMethod來訪問。在YAHOO.myProject.myModule外部,公共成員可以用YAHOO.myProject.myModule.myPublicProperty和YAHOO.myProject.myModule.myPublicMethod來訪問。
私有變量myPrivateProperty和myPrivateMethod只能被匿名函數(shù)本身或返回對(duì)象的成員訪問。盡管匿名函數(shù)會(huì)立即執(zhí)行和終止,但它們依然是保留著,憑借閉包(closure)的力量——通過一個(gè)函數(shù)的局部變量在這個(gè)函數(shù)返回后是保留的規(guī)則。只要 YAHOO.myProject.myModule需要它們,我們的兩個(gè)私有變量就不會(huì)被銷毀。 

實(shí)踐這個(gè)模式。讓我們來看看這個(gè)模式的一個(gè)常見應(yīng)用案例。假設(shè)你有一個(gè)列表,列表上的一些項(xiàng)可以被拖拽。應(yīng)用拖拽的項(xiàng)上有拖拽的CSS類。 
<!--這個(gè)腳本文件包含所有的YUI實(shí)用程序-->
  <script type="text/javascript"
src="http://yui.yahooapis.com/2.2.2/build/utilities/utilities.js"></script>
<ul id="myList">
   <li class="draggable">一項(xiàng)</li>
   <li>二項(xiàng)</li> <!--二項(xiàng)將不能被拖拽-->
   <li class="draggable">三項(xiàng)</li>
   </ul>
<script>
  YAHOO.namespace("myProject");
  YAHOO.myProject.myModule = function () {
 //YUI實(shí)用程序的私有簡寫引用:
  var yue = YAHOO.util.Event,
  yud = YAHOO.util.Dom;
 //私有方法
  var getListItems = function () {
 // 注意這個(gè)地方使用其他的私有變量,包括"yud"YAHOO.util.Dom的簡寫:
  var elList = yud.get("myList");
  var aListItems = yud.getElementsByClassName(
  "draggable", //得到僅有CSS類"draggable"的項(xiàng)
  "li", //僅返回列表項(xiàng)
  elList //限定搜索改元素的子
  );
  return aListItems;
  };
 //這個(gè)放回的對(duì)象將變成YAHOO.myProject.myModule:
  return  {
 aDragObjects: [], //可對(duì)外訪問的,存儲(chǔ)DD對(duì)象
 init: function () {
  //直到DOM完全加載好,才實(shí)現(xiàn)列表項(xiàng)可拖拽:
  yue.onDOMReady(this.makeLIsDraggable, this, true);
  },
 makeLIsDraggable: function () {
  var aListItems = getListItems(); //我們可以拖拽的那些元素
  for (var i=0, j=aListItems.length; i<j; i++) {
  this.aDragObjects.push(new YAHOO.util.DD(aListItems[i]));
  }
  }
 };
  }();
//上面的代碼已經(jīng)執(zhí)行,所以我們能立即訪問init方法:
  YAHOO.myProject.myModule.init();
  </script>
這是一個(gè)簡單的例子,特意寫的詳細(xì)一些——如果按照這種方式做,我們無疑能把它寫的更緊湊。當(dāng)項(xiàng)目變得更加復(fù)雜和它的API增加,這個(gè)模式縮放的很好。通過這種方式,它避免了全局命名空間,提供了對(duì)外的可以訪問的API方法,支持受保護(hù)或“私有”的數(shù)據(jù)和方法。 

[1]原文:《a javascript module pattern》。這是在YUI blog上的,有的地方可能打不開,可以搜一下英文的轉(zhuǎn)載或者利用搜索引擎的緩存也能看。 

[2]《A JavaScript Module Pattern - JavaScript的一種模組模式》這是別人的翻譯,參考了不少,不過感覺挺不方便看的,這是我翻譯的這篇文章的一個(gè)原因,當(dāng)然最主要的原因是這篇文章算是學(xué)習(xí)YUI的最基礎(chǔ)的文章了,整個(gè)YUI的模塊模式都基于此。 

相關(guān)文章

  • js獲取當(dāng)前路徑的簡單示例代碼

    js獲取當(dāng)前路徑的簡單示例代碼

    本篇文章主要是對(duì)js獲取當(dāng)前路徑的示例代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2014-01-01
  • w3c聲明下可運(yùn)行 兼容性比較好的js對(duì)聯(lián)廣告集合

    w3c聲明下可運(yùn)行 兼容性比較好的js對(duì)聯(lián)廣告集合

    最近有美工朋友找我們要兼容性比較好的對(duì)聯(lián)廣告代碼,我們給他一個(gè)他竟然不能運(yùn)行,經(jīng)過排查,這是因?yàn)楝F(xiàn)在的廣告也用了一樣代碼,函數(shù)命名重復(fù)。
    2011-07-07
  • JavaScript數(shù)組隨機(jī)排列實(shí)現(xiàn)隨機(jī)洗牌功能

    JavaScript數(shù)組隨機(jī)排列實(shí)現(xiàn)隨機(jī)洗牌功能

    這篇文章主要介紹了JavaScript數(shù)組隨機(jī)排列實(shí)現(xiàn)隨機(jī)洗牌功能的方法,涉及javascript中基于list.sort方法實(shí)現(xiàn)數(shù)組隨機(jī)排列的技巧,可應(yīng)用于隨機(jī)洗牌,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-03-03
  • extjs4圖表繪制之折線圖實(shí)現(xiàn)方法分析

    extjs4圖表繪制之折線圖實(shí)現(xiàn)方法分析

    這篇文章主要介紹了extjs4圖表繪制之折線圖實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了extjs4繪制折線圖的相關(guān)操作技巧、實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • 深入理解Javascript中的valueOf與toString

    深入理解Javascript中的valueOf與toString

    javascript中所有數(shù)據(jù)類型都擁有valueOf和toString這兩個(gè)方法,null除外。它們倆解決javascript值運(yùn)算與顯示的問題,本文將詳細(xì)介紹,有需要的朋友可以參考下
    2017-01-01
  • JavaScript實(shí)現(xiàn)簡易tab欄切換內(nèi)容欄

    JavaScript實(shí)現(xiàn)簡易tab欄切換內(nèi)容欄

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡易tab欄切換內(nèi)容欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • bootstrap IE8 兼容性處理

    bootstrap IE8 兼容性處理

    這篇文章主要為大家詳細(xì)介紹了bootstrap IE8 兼容性處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Bootstrap表單布局

    Bootstrap表單布局

    這篇文章主要介紹了Bootstrap表單布局的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • JavaScript中檢查對(duì)象property的存在性方法介紹

    JavaScript中檢查對(duì)象property的存在性方法介紹

    這篇文章主要介紹了JavaScript中檢查對(duì)象property的存在性方法介紹,本文講解了4種方法來檢查某個(gè)對(duì)象o是否擁有property x,需要的朋友可以參考下
    2014-12-12
  • 微信小程序 引入es6 promise

    微信小程序 引入es6 promise

    本篇文章主要介紹了微信小程序引入es6 promise的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-04-04

最新評(píng)論

泗水县| 柏乡县| 屏南县| 汕尾市| 四川省| 五莲县| 崇明县| 大化| 东城区| 盐山县| 纳雍县| 固始县| 包头市| 石柱| 德阳市| 肇源县| 蒙自县| 淳安县| 墨竹工卡县| 轮台县| 文昌市| 桦南县| 越西县| 平顺县| 江门市| 溧水县| 铜鼓县| 辽宁省| 灵山县| 杂多县| 清水河县| 丘北县| 宁夏| 阜新| 石狮市| 武定县| 灵武市| 襄汾县| 万年县| 远安县| 安岳县|