2014-11-05 29 views
0

我正在構建一個事件跟蹤api,並需要提供一個JS類與其中一些將被要求和一些可選的屬性列表。另外,不應該添加新的屬性。Javascript類 - 如何使屬性需要和可選

一旦客戶端實例化並傳遞基於類的對象,我將序列化對象並將其作爲查詢字符串發送。我已經有這部分,但不知道如何限制客戶端創建新的屬性。

我該如何去設計JS中的類?

+0

'Object.freeze()'? – 2014-11-05 04:41:05

回答

0

有很多方法可以做你想做的事情。對於像underscorejs/jquery extend這樣的實用程序,以及一些下劃線的實用方法(map,reduce等),必需/可選項非常容易。

防止對象實際具有其他屬性,雖然有點棘手。您可以可能運行已知必需/可選屬性的數組作爲支票,並對任何與您的條件不符的屬性值執行delete

另一種選擇是使用密封件。你在mozilla的網站here上閱讀了更多關於這個的內容。

所以我想我會做的是通過做一個健全的檢查對他們的存在獲得所需的屬性。您可以通過使用擴展來提供和打包/解包您的選項。

最後(也許是一條更好的路線)將強制用戶調用像setMyProperty('value')這樣的getter/setter方法來填充任何必需/可選屬性值。這樣,您就不必使用上述工具編寫大型的解決方案。

JS只是很有趣。兩種解決方案都不是完美的,但它們都是可能的解決方案。我相信也有其他人。這只是JS中的一部分,可能會讓人非常痛苦。祝你好運。

>>>編輯< < <

這可能不是完美的,但是這是我到目前爲止已經做了可選的/所需的屬性。我顯然認爲他們只是在構造函數中傳入一組屬性。

var _Required = { 
     requiredProperty1: null, 
     requiredProperty2: null, 
     requiredProperty3: null 
    }; 

    var _Optionals = { 
     optionalProperty1: null, 
     optionalProperty2: null, 
     optionalProperty3: null 
    }; 

    var EventTrackerAPI = function(settings) { 
     var requiredProp, optionalProp; 

     this.required = {}; 
     this.optional = {}; 

     for(requiredProp in _Required) { 
      if(!settings.hasOwnProperty(requiredProp)) { 
       throw new Error('FAILED to create an instance of EventTrackerAPI - Required Property (' + requiredProp + ') Missing!') 
      } 

      this.required[requiredProp] = settings[requiredProp]; 
     } 

     for(optionalProp in _Optionals) { 
      if(settings.hasOwnProperty(optionalProp)) { 
       this.optional[optionalProp] = settings.hasOwnProperty(optionalProp); 
      } else { 
       this.optional[optionalProp] = null; 
      } 
     } 
    }; 

無論如何,我可能會做類似上述的事情。它還不完美(因爲我在大約10分鐘內把它扔在一起),但它應該是一個好的開始。我也只是不允許訪問私人存儲。

當我準備好實際提取屬性時(比如準備序列化時),我會做類似於構造函數中的操作 - 只需手動通過並獲取您實際需要的內容即可 - 一切都會被這種方式拋棄。事實上,刪除可選/必需的邏輯並使它們成爲對象原型的方法(例如...)

+0

謝謝..不幸的是,我沒有依靠外部圖書館的奢侈。需要純粹的JavaScript。 – user2727704 2014-11-05 04:48:09

+0

下劃線在github上提供它們的源代碼。我必須時不時地抓住一種或兩種方法,因爲你有完全相同的原因。它的一些工作,但值得它來獲得一些功能。只是一個念頭;) – 2014-11-05 04:52:16

+0

現在你已經讓我對此有點好奇了。我可能會嘗試寫點東西來做你正在談論的事情。如果明天我能得到它,我會發佈一個github鏈接作爲後續(也就是說,如果你沒有找到第一個之後的答案)。 – 2014-11-05 04:55:48