我的架構 別名機制

來源:互聯網
上載者:User

這個別名機制類似jQuery的noConflict。jQuery所佔用的全域變數有兩個:jQuery與$。你也可以說它們是其命名空間,整個架構就以樹狀式“單足獨立”地建立於其上。但是由於我的東西是架構,換言之存在許多檔案(如果你沒有把它整合到一個檔案的話),除了核心模組外,其他模組通過"require"方法動態載入到這個樹狀結構的命名空間上。可是,如果我把它的命名空間佔用了,那些其他模組並不能非常智能地找到新的命名空間,因此我們需要一個永久性命名空間,如Ext的Ext。但這些簡單的名字有很大機率被人佔用的,因此,這名字應該足夠長,足夠複雜,非常沒有意思,只能通過程式產生。因此我的架構搞了兩個命名空間,一個是"dom",另一個是 escape(document.URL.split("#")[0])。對於這樣單頁面的application,它的命名空間便可以隨頁面而改變了。"#"是防止使用錨點導致document.URL發生改變的。

下面就是一個小小的實驗:

<!doctype html><html lang="en">  <head>    <meta charset="utf-8" />    <meta content="IE=8" http-equiv="X-UA-Compatible"/>    <title>別名機制 by 司徒正美 </title>    <style type="text/css">      #box {        width:200px;        height:200px;        border:1px solid black;        position:absolute;        left:20ex;        top:100px;        background-color:#EEE8AA;      }    </style>    <link rel="kinetic-stylesheet" type="text/css" href="demo.kss" />    <script type="text/javascript">      var dom = {name:"別人的架構"};//一樣使用dom做命名空間      //================我的庫=================      (function(window,undefined){        var dom = {          name:"我的庫"        },       _dom = window.dom//把別人的架構儲存到一個臨時變數中        //永久性命名空間,如果這個名字被其他架構佔用就沒救了        //永久性命名空間是用於模組載入時,讓新模組找到當前類架構的        var namespace = escape(document.URL.split("#")[0]);        dom.alias = function(newName) {          //如果不指定新名,則隨機產生一個,換言之,則進入忍者模式,需要用一個變數來接受它          newName = newName || "dom"+Math.random();          window.dom = _dom;          return  window[namespace] = window[newName]  = dom;        }        window[namespace] = window.dom = dom;      })(window);      window.onload = function(){        var a = dom.alias("$$");        alert(a.name);        alert(window.dom.name)//讓與別人        alert($$.name)//測試新的命名空間        alert(window[escape(document.URL.split("#")[0])].name)//測試永久性命名空間      }    </script>  </head>  <body>    <div id="box"></div>  </body></html>

<br /><!doctype html><br /><html lang="en"><br /> <head><br /> <meta charset="utf-8" /><br /> <meta content="IE=8" http-equiv="X-UA-Compatible"/><br /> <title>別名機制 by 司徒正美 </title><br /> <style type="text/css"></p><p> #box {<br /> width:200px;<br /> height:200px;<br /> border:1px solid black;<br /> position:absolute;<br /> left:20ex;<br /> top:100px;<br /> background-color:#EEE8AA;<br /> }<br /> </style><br /> <link rel="kinetic-stylesheet" type="text/css" href="demo.kss" /></p><p> <script type="text/javascript"><br /> var dom = {name:"別人的架構"};//一樣使用dom做命名空間<br /> //================我的庫=================<br /> (function(window,undefined){<br /> var dom = {<br /> name:"我的庫"<br /> },<br /> _dom = window.dom//把別人的架構儲存到一個臨時變數中<br /> //永久性命名空間,如果這個名字被其他架構佔用就沒救了<br /> //永久性命名空間是用於模組載入時,讓新模組找到當前類架構的<br /> var namespace = escape(document.URL.split("#")[0]);<br /> dom.alias = function(newName) {<br /> //如果不指定新名,則隨機產生一個,換言之,則進入忍者模式,需要用一個變數來接受它<br /> newName = newName || "dom"+Math.random();<br /> window.dom = _dom;<br /> return window[namespace] = window[newName] = dom;<br /> }<br /> window[namespace] = window.dom = dom;<br /> })(window);</p><p> window.onload = function(){<br /> var a = dom.alias("$$");<br /> alert(a.name);<br /> alert(window.dom.name)//讓與別人<br /> alert($$.name)//測試新的命名空間<br /> alert(window[escape(document.URL.split("#")[0])].name)//測試永久性命名空間<br /> }</p><p> </script><br /> </head><br /> <body></p><p> <div id="box"></div></p><p> </body><br /></html><br />

運行代碼

具體用法看我的文件(已放出)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.