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,利用這一點,便可以只輸出到自己的屬性了