2010-12-19 90 views
153

JavaScript中的下劃線前綴只是一個約定,就像例如在Python私有類方法中那樣?JavaScript中屬性和方法名的下劃線前綴

從2.7 Python文檔:

「私有」實例變量 不能從除內部 對象訪問Python中是不存在的。 但是,有一個約定是 ,後面是大多數Python代碼:名稱爲 的前綴爲下劃線(例如 _spam)應被視爲API的非公開部分(它是否爲 是函數,方法或數據 成員)。

這是否也適用於JavaScript?

就拿這段JavaScript代碼:

function AltTabPopup() { 
    this._init(); 
} 

AltTabPopup.prototype = { 
    _init : function() { 
     ... 
    } 
} 

此外,下劃線使用前綴的變量。

... 
    this._currentApp = 0; 
    this._currentWindow = -1; 
    this._thumbnailTimeoutId = 0; 
    this._motionTimeoutId = 0; 
    ... 

只有約定?還是有更多的下劃線前綴?


我承認我的問題是非常相似this question,但它並沒有做出一個聰明關於JavaScript中的下劃線前綴的意義。

+0

另請參閱http://stackoverflow.com/questions/17359885/defining-properties-and-naming-conventions-in-javascript – 2013-06-28 15:54:42

回答

187

這只是一個約定。 Javascript語言對以下劃線字符開頭的標識符沒有任何特殊含義。

這就是說,對於不支持encapsulation的語言而言,這是一種非常有用的慣例。儘管沒有辦法阻止某人濫用您的課程實施,但至少它確實會闡明您的意圖,並且首先記錄錯誤的等行爲。

+4

是的。即使語言不「支持」它,它也是一個非常方便的約定。 – 2010-12-19 18:47:35

+0

嚴重的概率。 http://jsfiddle.net/VmFSR/ 正如你在那裏看到的那樣,值創建的名字只能通過在'_'前面添加新值來創建,我很想知道發生了什麼!?爲什麼它不是'this.name'呢? – 2013-07-26 23:14:33

+1

@Muhammad Umer,我不確定我是否理解你的評論。 'console.log(someone._name =「Jean Dupont」);'和'console.log(someone.name);'一樣工作,它既指派又評估屬性後面帶下劃線的前綴成員。 [你可以看到](http://jsfiddle.net/VmFSR/1/),theres沒有保證封裝通過下劃線:) – 2013-07-26 23:25:45

80

JavaScript實際上確實支持封裝,通過涉及hiding members in closures(Crockford)的方法。也就是說,這有時很麻煩,下劃線約定是一種非常好的約定,用於私人事物,但實際上您並不需要來隱藏。

+15

投票澄清如何實現封閉,反對說下劃線是良好的慣例。所以我不會以任何一種方式投票:) – Jason 2011-06-17 03:14:18

+3

隱藏成員關閉有時會妨礙可測試性。看看這篇文章:http://www.adequatelygood.com/2010/7/Writing-Testable-JavaScript – 2013-02-05 18:46:31

+3

@Jason - 只是好奇,爲什麼你考慮強調一個不好的約定? – 2013-05-21 14:57:40

7

「只有約定或者是有更多的背後下劃線前綴?「

除了隱私約定,我還希望幫助人們認識到下劃線前綴也用於依賴於獨立參數的參數,特別是在URI錨點地圖中。從屬關鍵字始終指向地圖。

例(從https://github.com/mmikowski/urianchor):

$ .uriAnchor.setAnchor({ 頁: '個人資料', _page:{ UNAME: '溫迪', 在線: '今天' }} ) ;

在瀏覽器搜索字段中的URI錨改爲:

#頁=簡介:UNAME,溫迪|在線,今天

這是用來驅動的應用程序狀態的約定基於哈希變化。

1

應該指出的是有一個名爲下劃線的JS庫。使用該庫時,_前綴確實有意義。

http://underscorejs.org/

+0

...但我沒有問在這方面的問題... – 2016-12-21 22:22:15

+0

下劃線庫對這個問題沒有任何意義,雖然不錯,但插件;) – Shanimal 2017-07-26 23:07:52

1

import/export現在正在做與ES6的工作。如果我的大多數函數都被導出,我仍然傾向於用_的前綴未輸出函數。

如果只導出一個類(如在角項目中),則根本不需要。