2011-08-13 43 views
1

它們是什麼和我們如何做到這一點?你可以給我一個例子嗎?例如,爲了避免與多個庫發生衝突,請使用以下命令:爲什麼我們需要私有變量?

+4

你在調用私有變量?你爲什麼問這個問題?請稍微描述一下。 –

回答

6

假設他們都使用常用的變量,如data。如果兩個庫使用私有變量它的所有罰款:

var lib1 = (function() { 
    var data; 

    return { 
     get: function() { return data }, 
     set: function(v) { data = v } 
    }; 
})(); 

// Supposed to do something different: 
var lib2 = (function() { 
    var data; 

    return { 
     get: function() { return data }, 
     set: function(v) { data = v } 
    }; 
})(); 

lib1.set(123); 
lib2.set(456); 
lib1.get(); // 123 
lib2.get(); // 456 

但是假設它們不使用私有變量,但全球的像這樣:

var lib1 = (function() { 
    return { 
     get: function() { return data }, 
     set: function(v) { data = v } 
    }; 
})(); 

// Supposed to do something different: 
var lib2 = (function() { 
    return { 
     get: function() { return data }, 
     set: function(v) { data = v } 
    }; 
})(); 

lib1.set(123); 
lib2.set(456); 
lib1.get(); // 456 - overwritten by lib2. lib1 might not work properly anymore. 
lib2.get(); // 456 

所以lib1.get()lib2.get()獲取相同的數據。

這個例子當然太明顯了,但爲了保持安全,使用私有變量是一個好習慣。

3

變量被封裝在一個類中以阻止它們的名稱相互衝突。這些可以是公共或私人的。有時需要確保只使用設置它們的函數來更改變量。例如,需要驗證日期的某些部分,以阻止某人設置2月45日的無效日期。

var factorial = (function(){ 
    var precog = [1,1];// ===undefined for other indices, N = undefined || N 
    return function(y){ 
     return precog[y] || (precog[y]=y*arguments.callee(y-1)); 
    }; 
})(); 

這是帶有私人預編程的JavaScript函數。這存儲了以前計算的值,並且它是私人的,以阻止它們被操縱。

0

我相信有原因名稱空間。我理解的一種方式是:privateprotectedpublic表達式在團隊環境中幫助很多以便其他開發人員不會最終使用方法您不打算這樣做。也就是說,只有當方法或屬性只需要被同一個對象訪問時,你只能使用private。當需要繼承類來承載相同功能時使用protected,並且在不同類的對象需要訪問您的對象時使用public

例如:

Victim具有

  • 私有方法haveAnxiety()
  • 公共屬性appearsToBeRich:布爾

類具有

  • 私有方法簡介(OBJ:受害者)
  • 私有方法搶劫(OBJ:受害者)

Robber->profile()將需要訪問Victim->appearsToBeRich。如果Victim->appearsToBeRich返回true,那麼Victim對象將獲得盜取。一個對象永遠不需要運行Victim->haveAnxiety,因爲Victim將運行this->haveAnxiety()只要Victim對象開始被搶劫。

當然,現實世界的例子是比我的例如LOT更復雜(我希望他們更優美)。無論如何,我希望這會有所幫助。

+3

我不確定這是否與JavaScript有關。 – pimvdb

相關問題