2017-02-26 62 views
1

我注意到,如果我編寫一個只對調用方法的局部變量起作用的方法(不直接與類變量交互),那麼我會得到一個警告,說明該方法可以是靜態的。在JavaScript/TypeScript中,帶有「方法的方法可能是靜態的嗎?

有時,將大塊代碼抽象成單獨的方法是很好的。這在某種程度上是否被認爲是JavaScript/TypeScript中的糟糕做法?

由於我不斷收到這些警告,我想借此機會警察局警員會對我發問,詢問可能引起意見的問題。讓我爲此辯護,說我得到的警告不是意見。他們是明確的警告。這表明存在一個不是意見的答案,至少從決定創建這些警告的人的角度來看。

編輯: 我被要求在這裏提供代碼,以提供一個有效的理由,爲什麼我想這樣做。我個人認爲這不會增加我詢問的問題的清晰度,但這裏是一個在WebStorm中產生警告的方法的例子。

//Change object array in *.content objects to values array 
//noinspection JSMethodCanBeStatic 
transformData(visibleData) { 
    const ret: any = {}; 
    ret.headings = visibleData.headings; 
    ret.checkbox = this.checkBox;             //add if the table needs checkboxes 
    ret.content = []; 
    for (let i = 0; i < visibleData.content.length; i++) { 
     ret.content.push(_.values(visibleData.content[i])); 
    } 
    return ret; 
} 

此功能的點是取實例的一個副本,以便不修改實例本身,並創建一個不同的對象,主要是一個值僅陣列,其將被用於在數據綁定模板。我這樣做,所以我的表模板可以重複使用,因爲列的數量不盡相同。

+0

聽起來沒有Angular相關,只有TypeScript。 –

+0

謝謝!我更新了標題,內容和標記 –

+0

你從哪裏得到這些警告?編譯器本身不生成它,也許你的IDE?另外,如果你能顯示你的代碼,這將是有幫助的。 –

回答

1

不與實例交互的代碼應該是一個自由函數,或者當你相信它與類API緊密結合時,它應該是一個類的靜態方法。

您添加到API的每個附加方法都必須受支持。所以較大的類需要比較小的類更多的支持。在某些語言中,像Java一樣,你不能有自由函數,所以你必須把函數附加到某個類上,但是TypeScript和JS更加靈活,所以不需要污染類API。

你可以從性能優化的角度考慮它。

當JS評估類方法時,它會在對象實例中查找它,而不是在對象原型中,而不是在父級的原型中查找。每次查找都會消耗CPU時間,所以當您考慮性能時,可以選擇自由函數。

+0

有趣的是,在我上面的例子中,'this.checkBox'是一個實例變量,它包含在方法中可以防止IDE產生警告。當我評論這個單獨的作業時,我收到警告。這項任務是否可以防止您提到的問題? –

+0

@ChrisSharp正好!順便說一句,你以後加了嗎?不知何故,我在首先閱讀你的問題時錯過了這個變量。 –

+0

我必須在抑制警告後添加它。這項任務如何提高績效?我仍然困惑。如果那是有效的,那麼爲什麼不總是用一些像這樣的任意賦值將它綁定到實例? –

相關問題