2016-04-11 37 views
1

我正在編寫一個我打算使用很多的JavaScript庫,並可能最終公開發布。現在,我做了很多的功能,「類的構造函數」的定義是這樣的:我應該嘗試在我的JavaScript類中強制執行強數據類型嗎?

function Point(x, y) 
{ 
    this.y = typeof y !== 'undefined' ? y : 0; 
    this.x = typeof x !== 'undefined' ? x : 0; 

    if (typeof this.x === "number" && typeof this.y === "number") 
    { 
    this.x = x; 
    this.y = y; 
    } 
    else if (this.x instanceof Point && typeof this.y === "undefined") 
    { 
    this.x = x.x; 
    this.y = x.y; 
    } 
    else 
    { 
    throw ("Point() Constructor: Invalid arguments."); 
    } 
} 

這讓我不僅有「兩個不同的構造函數」這個「類」,但它也保證了當對象被實例化時,它具有期望的類型,如果不是,則拋出半有用的錯誤。

這一切似乎都是一個好主意,但現在我已經進入了一種方式,並且我已經看到了其他生產JavaScript源代碼(例如Mozilla的東西),我是開始有第二個想法,因爲人們並沒有真的這樣做。現在我想知道,「爲什麼我要強制鬆散類型的語言符合這些嚴格的打字標準?」

當涉及到錯誤處理和類型檢查時,JavaScript庫的預期標準是什麼?

可能與this question稍有關係,但我正在尋找寫我自己的東西。

+0

我不認爲你正在強制打字,你允許靈活的輸入,就像'Date()'... – dandavis

+0

@dandavis也許這不是最好的例子。我更關心所有的類型檢查。即使在使用ONE參數的簡單函數中,我正在進行類型檢查,然後在發出錯誤類型時拋出錯誤 –

回答

2

通過嘗試強制打字,您最終的工作是針對該語言。這種方法有其優勢,但通過使用諸如TypeScript之類的東西可以更容易地完成。

你必須用這種方法問自己的最大問題是,如果你已經想清楚並覆蓋了需要在應用程序中處理的所有問題域,並且這可以擴展以解決其他可能不會想到的問題的。如果是這樣,這種方法難以維持,例如你是否覺得你可以花時間和精力去創建你所有的構造函數,函數等等,以確保所有的東西都符合現有的標準?這很重要,因爲雖然JavaScript處理你正在做的事情,但你可以說這不符合語言的「精神」,這或多或少意味着語言無法幫助你以這種方式編寫代碼。

+0

如果您想沿着這條路走下去(即,不止是偶爾的類型檢查),我建議使用某種工具來幫助它。 TypeScript將是一個選項(正如凱文提到的)。另一個將是[流](http://flowtype.org/)(我的偏好,因爲它與原生JS工作)。對於運行時類型檢查,也可以查看https://github.com/codemix/babel-plugin-typecheck。 –