1. 程式人生 > >JavaScript名稱空間、物件列舉

JavaScript名稱空間、物件列舉

本文是前端學習筆記的第七篇,對應web前端開發JavaScript精英課js的第22課時,本篇主要寫JS如何避免對全域性變數的汙染,以及物件列舉(其實也就是遍歷物件的屬性)

 

目錄

名稱空間

通過閉包與立即執行函式的方式

物件列舉


 

名稱空間

在JavaScript中,全域性變數的汙染往往是一個棘手的問題,如果什麼變數都定義在全域性中,造成的後果便是程式碼結構混亂,且容易造成命名衝突,畢竟如果在同一個業務程式碼中,往往名詞都是那麼幾個,一旦衝突造成的後果是難以預料的,且排查十分困難,因此便產生了一種為解決這類問題而產生的處理方法,即名稱空間

名稱空間起到的作用主要便是解決命名衝突,到現在為止有多種方案,這裡我只寫舉一個我認為最好的方案

通過閉包與立即執行函式的方式

先來看下面一段程式碼

<script>

        var name = 'abc';

        var init = (function () {

            var name = 'bcd';
            
            return function () {
                console.log(name);    // bcd
            };

        }());

        init();

</script>

通過立即執行函式,把涉及到的變數、函式都放在了規定的區域內,可讀型大大提高了,更加適用於模組化開發了。同時避免了命名衝突的問題,因為此時即使有命名相同的屬性,用的也是作用域鏈中最近的執行期上下文物件中的屬性,不會用到全域性中的屬性,最後通過閉包的方式則把裡面的過程最終要得到的結果返回出來

 

物件列舉

所謂物件列舉,其實就是把物件的所有屬性遍歷一遍,這種遍歷方式還是挺新穎的,在Java裡類似的只有for each迴圈獲取陣列或集合的元素,而在JS中我們可以通過for in迴圈拿到物件的所有屬性

<script>

        var obj = {
            name : 'JayChou',
            age : 39,
            sing : function () {
                console.log('最美的不是下雨天,是曾與你躲過雨的屋檐');
            }
        };

        for (key in obj) {
            // console.log(key);
            console.log(obj[key]);
        }

</script>

for in迴圈每次都會抽取出物件的一個屬性,可以試著把註釋放開,就知道了,然後通過console.log輸出物件的屬性就可以達到遍歷物件的效果

注意,在console.log()中的不是obj.key,而是obj[key],為什麼呢?因為obj.key會被系統隱式的轉為obj["key"],而物件上顯然是沒有key這個屬性的,因此我們直接使用系統隱式轉換後的方式進行輸出,obj[key]中key會自動執行toString方法轉為字串,達到我們想要的效果,最終輸出的就是obj[name]、obj[age]、obj[sing] 等等,平時我們也可以直接寫obj[xxx]這樣的形式來表示屬性,這樣還省略了系統隱式轉換的過程,效率更高

 

但是,有時可能物件的原型物件身上也有屬性,而通過for in迴圈的方式是會遍歷所有屬性的,有時我們並不需要遍歷原型物件上的屬性,這時我們可以通過hasOwnProperty()方法解決

<script>

       Student.prototype.money = 99999;

       function Student() {
           this.name = 'JayChou';
           this.age = 39;
           this.sing = function () {
               console.log('最美的不是下雨天,是曾與你躲過雨的屋檐');
           };
       }

       var stu = new Student();

        for (key in stu) {
            if (stu.hasOwnProperty(key)) {
                console.log(stu[key]);
            }
        }

</script>
若key是自己的屬性,就會返回true,否則false,利用這一點,便可以只輸出到自己的屬性了