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

首頁 > 編程 > JavaScript > 正文

JavaScript 命名空間 使用介紹

2019-11-20 22:21:15
字體:
來源:轉載
供稿:網友

使用過Java、C#的同學對命名空間非常的熟悉,在復雜的系統中會有N多的函數、對象,語言提供的、架構預定義的,這么多的函數和對象,由于編程規范要求起有實際意義的名字,難免會重名發生錯誤調用,而有了命名空間煩惱就沒有了,不但可以分類組織函數與對象,還可以形成隔離,解決重名問題。

使用JavaScript就沒有這么舒服了,Javascript只有函數作用域,什么塊兒啊、神馬文件啊統統都認為是一個命名空間的,有時候因為一些重名問題導致的錯誤讓人莫名其妙,難以調試解決。

一個簡單的例子

復制代碼 代碼如下:

<input type="button" value="test" onclick="alert();"/>

        <script type="text/javascript">
            function alert(){
                //.......

                test2();
                //.......
            }

            function test2(){
                alert('test2')
            }

在個例子在不同的瀏覽器下有不同表現,IE會報Stack over flow, Firefox會死掉。。。反正都會報錯,很簡單的錯誤,代碼中自定義了一個alert函數,在alert函數中調用了test2函數,test2函數中意圖調用window的alert方法,這樣循環調用了,也許看了你會說這么明顯的錯誤誰會犯,但是如果自定義的方法叫close(這個經常會出現吧),然后內部調用了一個外部文件的函數,該函數調用了window的close方法,這樣錯誤是不是隱蔽了很多呢。

簡單的命名空間

由于JavaScript沒有文件作用域,不同的函數分散在不同的文件中,甚至由不同的人編寫,重名的概率大大增加。是不是足夠小心就可以了呢?也不盡然,還有些意外情況,比如經常會用到繼承,于是寫了一個沒出現過的函數名extend,不料在EcmaScript5中加入了extend函數,命名空間的必要性就體現出來了。

JavaScript有函數的作用域,可以利用這點把自定義的函數寫到一個函數體內,這樣函數內的變量、對象、函數就像在一個命名空間內一樣和外部隔離。

復制代碼 代碼如下:

<input type="button" value="test" onclick="(new namespace()).alert();"/>

        <script type="text/javascript">
            function namespace(){
                this.alert=function(){
                    console.log('test');
                }
            }
        </script>

這樣自定義的alert方法就不會和window的alert沖突了。

簡單進化

這樣可以是可以,但也有問題,最大的問題在于調用方式復雜而丑陋!每次調用的時候都要實例化對象,然后調用其方法,簡單修改代碼讓其實現自動實例化。

復制代碼 代碼如下:

<input type="button" value="test" onclick="NS.alert();"/>

        <script type="text/javascript">
            (function namespace(){
                this.alert=function(){
                    console.log('test');
                }

                window.NS=this;
            })();
        </script>

要看明白上面代碼首先要了解一下“立即執行函數”(江湖人是這么稱呼的)的技巧結構類似這樣

復制代碼 代碼如下:

(function xxx(){

       //function body

 })();
 


這樣寫xxx函數就可以在定義完后自動執行,看起來神奇,其實上面寫法可以拆成這樣

復制代碼 代碼如下:

function xxx(){

       //function body

 }

xxx();

就是定義一個函數,然后使用括號語法調用,而函數定義外面的一層括號只起到將函數聲明轉為函數定義表達式,因為只有表達式才可以使用括號調用??疵靼走@些妖蛾子之后上面代碼就簡單了,在自定義namespace函數最后把this賦值為window的NS屬性,在調用的時候直接使用NS.xx就可以了。看起來好了很多。

美化一下

上面的寫法看起來不錯了,但是函數名namespace貌似是多余的了,可以美化一下

復制代碼 代碼如下:

(function (){
                this.alert=function(){
                    console.log('test');
                }

                window.NS=this;
            })();

變成了一個立即執行的匿名函數,美化了一些,不過看起來還是怪怪的,對呀,明明是實例化的function,為什么方法定義不寫到prototype中呢,匿名函數怎么寫prototype。。。,還得動動腦筋

復制代碼 代碼如下:

(function(){
                var _NS=function(){

                }
                _NS.prototype.alert=function(){
                    console.log('test');
                }
                window.NS=new _NS();
            })();

寫幾個有用的函數

querySelector和querySelectorAll是W3C提供的新的查詢接口,但是名字好長,自己寫個簡單的,innerHTML屬性也常用到,寫個簡單版仿jQuery的html方法

復制代碼 代碼如下:

(function () {
            var _NS = function () {

            }

            _NS.prototype.select = function (selector,context) {
                var context = context || document;
                return context.querySelectorAll(selector);
            }

            _NS.prototype.isArrayLike=function(obj){
                if(obj instanceof Array){
                    return true;
                }

                var length=obj.length;
                if ( obj.nodeType === 1 && length ) {
                    return true;
                }
                return false;
            }

            _NS.prototype.html = function (obj,value) {
                var isArray=this.isArrayLike(obj), i=0;

                if (typeof value == 'string') {
                    if (!isArray) {
                        obj.innerHTML = value;
                    } else {
                        var length = obj.length;
                        while (i < length) {
                            obj[i].innerHTML = value;
                            i += 1;
                        }
                    }
                } else {
                    if (!isArray) {
                        return obj.innerHTML;
                    } else {
                        return obj[0].innerHTML;
                    }
                }
            }

            window.NS = new _NS();
        })();

這樣一個帶有命名空間的簡單JavaScript庫就寫成了,不用擔心命名沖突了,但是用起來很不方便啊,做前端的同學都用過jQuery,人家用起來那叫一個簡單,jQuery是怎么做的?欲知后事如何,且聽下回分解。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩在线视频观看| 国产综合久久久久| 日韩免费在线视频| 中文.日本.精品| 国产欧美一区二区| 亚洲精品91美女久久久久久久| 成人av色在线观看| 日韩av网站导航| 久久久久久久电影一区| 2021久久精品国产99国产精品| 国产一区二区日韩| 欧美午夜精品伦理| 91精品久久久久久综合乱菊| 久久久噜噜噜久久中文字免| 亚洲xxxxx| 欧美中在线观看| 国产精品视频久| 最近2019免费中文字幕视频三| 亚洲成年人影院在线| 日韩免费观看在线观看| 欧美日韩国产第一页| 国产91对白在线播放| 91精品在线一区| 欧美性高跟鞋xxxxhd| 欧美性色视频在线| 日韩欧美在线视频日韩欧美在线视频| 久久久99免费视频| 国产精品夜色7777狼人| 中文字幕日韩专区| 久久久久国产精品一区| 国产精品久久久久久久久久三级| 中文字幕少妇一区二区三区| 色琪琪综合男人的天堂aⅴ视频| 亚洲激情 国产| 国产精品白丝jk喷水视频一区| 日韩精品欧美激情| 欧美在线观看视频| 久久99国产综合精品女同| 亚洲福利视频在线| 91av在线视频观看| 国产精品视频xxxx| 欧美日韩国产精品一区二区不卡中文| 久久精品在线视频| 亚洲视频在线观看视频| 一本色道久久88综合日韩精品| www.亚洲人.com| 大荫蒂欧美视频另类xxxx| 欧美日韩激情小视频| 欧美激情日韩图片| 日韩高清电影好看的电视剧电影| 黄色精品在线看| 亚洲乱亚洲乱妇无码| 欧美色另类天堂2015| 亚洲第一精品夜夜躁人人躁| 亚洲精品欧美日韩专区| 国产成人+综合亚洲+天堂| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产精品久久久久久av| 国产精品一区av| 亚洲国产女人aaa毛片在线| 成人h片在线播放免费网站| 中文字幕亚洲无线码在线一区| 国内精品模特av私拍在线观看| 亚洲天堂男人的天堂| 国产一区二区三区视频| 欧美黑人性猛交| 欧美国产日韩一区二区三区| 深夜成人在线观看| 欧美精品福利在线| 久久精品中文字幕| 欧美成人国产va精品日本一级| 欧美一级在线亚洲天堂| 97av在线视频免费播放| 欧美在线激情网| 亚洲国产精品久久久久秋霞蜜臀| 国产一区二区三区在线免费观看| 久久国产精品视频| 中文字幕亚洲二区| 亚洲老头同性xxxxx| 久久久久国产精品www| 国产乱人伦真实精品视频| 91av视频在线观看| 亚洲精品久久久久久久久久久久| 欧美激情精品久久久久久蜜臀| 国产精品久久久av| 91av视频在线免费观看| 亚洲大胆人体视频| 91精品国产乱码久久久久久久久| 色先锋久久影院av| 欧美精品一本久久男人的天堂| 成人有码在线视频| 亚洲精品美女久久久| 久久影院中文字幕| 国产欧美一区二区三区视频| 国产精品久久一| 欧美在线观看www| 国产精品视频中文字幕91| 精品亚洲一区二区三区在线观看| 成人精品久久av网站| 国产美女久久精品| 亚洲大胆人体在线| 欧美一区二区三区艳史| 91视频免费网站| 欧美视频国产精品| 成人性教育视频在线观看| 欧美精品情趣视频| 久久亚洲精品成人| 夜夜嗨av一区二区三区四区| 欧美激情第1页| 亚洲国产精品福利| 77777少妇光屁股久久一区| 青青草国产精品一区二区| 日韩在线视频一区| 91香蕉嫩草神马影院在线观看| 国产成人在线视频| 欧美自拍视频在线观看| 一本大道亚洲视频| 国产精品一区二区电影| 55夜色66夜色国产精品视频| 久热精品视频在线免费观看| 成人高h视频在线| 日韩欧美国产黄色| 久久久av网站| 欧美日韩亚洲一区二区三区| 国产成人精彩在线视频九色| 欧美亚洲国产日本| 国产成人在线一区二区| 97国产精品免费视频| 91精品视频播放| 欧美色视频日本高清在线观看| 亚洲自拍偷拍网址| 欧美另类极品videosbest最新版本| 久久久国产视频| 日韩精品电影网| 中文国产成人精品久久一| 亚洲电影免费观看高清| 欧美久久久精品| 亚洲欧美日韩精品久久奇米色影视| 日韩美女福利视频| 国产一区二区三区视频| 久久人人爽人人爽爽久久| 欧美亚洲在线视频| 亚洲偷熟乱区亚洲香蕉av| 亚洲乱码一区av黑人高潮| 久久99热精品| 日韩国产欧美精品一区二区三区| 97精品在线观看| 国产欧美久久久久久| 欧美亚洲伦理www| 精品久久久精品| 伊人亚洲福利一区二区三区| 狠狠色狠狠色综合日日小说| 国产中文字幕91| 57pao成人国产永久免费| 国内外成人免费激情在线视频| 日韩精品免费一线在线观看| 91精品中文在线| 在线精品高清中文字幕| 日本久久久久久久久| 欧美国产欧美亚洲国产日韩mv天天看完整| 26uuu亚洲伊人春色| 亚洲黄色片网站| 欧美电影免费观看高清完整| 欧美一级片免费在线|