![](/img/trans.png)
[英]How to access from 'private method' to 'public variable', in Javascript class
[英]should I use public method to access private variable inside a class?
偽代碼在JavaScript中。 我有Animal
類和使用私有變量_type
來保存動物類型的typeMatches
方法:
function Animal()
{
this._type = "dog";
}
Animal.prototype.getAnimalType = function()
{
return this._type;
}
Animal.protytype.typeMatches = function(animalType)
{
//option 1 - accessing private variable directly
return this._type === animalType;
//option 2 - accessing private through public method
return this.getAnimalType() === animalType; //accessing private through public method
}
我一直在類內部直接使用私有變量(選項1),但是最近有人告訴我,這是一種不好的做法,只要有機會,我就應該使用公共方法來獲取私有變量(選項2)。 但是我以這個變量是私有的為由而質疑這個建議,因為我在類中使用了它,所以我沒有違反任何約定,而直接訪問使我的代碼更清晰了。 我錯了嗎?
在絕對需要時執行此操作(並盡可能避免使用它)。
吸氣劑的唯一任務是返回數據,可能是在進行轉換以使其更易於使用之后。
例如背景字段
long _ticks = 500000000000L;
可以吸氣
public long GetTicks()
{
return _ticks;
}
的確,在這種情況下,使用背景字段和吸氣劑之間沒有區別。 但是,使用吸氣劑的問題在於,您現在使數據的外部和內部表示都相同。
我們可以很容易地表達出這是一個問題的原因:如果我們想將_ticks
作為string
返回給外界怎么辦? 現在我們必須破壞內部功能,否則我們將無法像普通接口一樣更改某些常規內容。
確實:我們試圖用私有字段的封裝來完成的事情現在已被破壞,因為您將嘗試在內部功能中使用外部表示。
現在,該代碼將破壞我們類中依賴於其傳遞數字類型而不是string
其他代碼。
public string GetTicks()
{
return _ticks.ToString();
}
在極少數情況下,我會提倡在類本身內部使用getter( GetAge()
像GetAge()
的GetAge()
這樣的計算字段),如果我這樣做,是因為這是最后一個可行的選擇。 將您的內部和外部代表分開,這將使您免於頭痛。
(我對Javascript並不是很熟悉,但是我相信代碼示例已經足夠清楚了。我意識到Javascript不太關心確切的類型,但這只是一個例子:可以進行許多不同類型的轉換。)
正如@Jeroen Vannevel指出的那樣,只有某些邏輯在獲取/設置背后是“必要的”。
例如,如果您有兩個屬性:
1)出生年份:
2)年齡
最簡單的方法是在設置BirtYear時計算年齡。 您可以執行1個setter來設置屬性,並為每個屬性設置2個getter。
人們向您推薦始終使用getter / setter的原因是,您的代碼中將始終具有相同的結構 ,並且永遠不會通過更改getter / setter來破壞任何功能 。 另外,在訪問屬性和函數時,您不必區分它們 (只有函數)
我幾乎總是使用em。 它更加一致。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.