2012-06-30 32 views
1

JavaScript相對較新,所以想知道達到以下要求的最佳方法是什麼。 我想創建JSON對象(RPC請求對象),並且需要強制執行一些結構。就我所知,JS是動態語言,因此我可以隨時將任何類型添加到對象中。但是,我喜歡定義一個類,我可以填充它來構造JSON請求。用於實施JSON結構的Javascript類

var RecReq = { 
      ID:{}, 
      HeaderLevel:{}, 
      Content:{} //Content object goes here 
     }, 
     HeaderLevel = { 
      HeaderID:{}, 
      Note:{} 
     }, 
     Content = { 
      Item: [] //Array of Item goes here 
     }, 
     Item = { 
      IDs:[] 
     }; 

    function ReceiveObj() { 
     this.RecReq = RecReq, 
      this.HeaderLevel = HeaderLevel, 
      this.Content = Content, 
      this.Item = Item 
    }; 
    return new ReceiveObj(); 

我相信很多上面的代碼有問題。我不認爲該對象是在初始化數組的情況下創建的。 在返回的對象上,我無法執行push()操作以將內容插入內容。

你會如何處理這個問題。您是否即時創建對象,或者更好地定義強制某種結構的對象。

+1

我不會爲JSON DTO創建一個JS類。通常情況下,您將DTO發送到某個Web服務;如果服務是以靜態類型語言實現的,那就讓它處理類型安全。另一種更適合動態語言的方法是使用單元測試來驗證代碼生成的對象的結構。 – millimoose

+0

感謝您分享您的經驗。我不會創建一個類,但可以即時構建一個對象。我的意圖只是向DOCUMENT所有對象「可以」包含,因此它不會在後端引發錯誤。爲了幫助我學習,能否請你建議我應該如何構建DTO(用慣用的JS方式)。它應該全部在一個班級還是我試圖做的方式(不同的變量指示班級中的不同字段/類型)。這感覺非常糟糕,所以一個例子會幫助我思考JS方式。再次感謝 – bsr

+1

要記錄事情,你可以使用服務器端定義 - 如果端點是使用.NET和WCF實現的,那麼這將是數據契約。 (如果服務不是某種公共API,這是一個很好的選擇。)否則,您可以查看使用「選項散列」模式的主要Javascript庫是如何記錄的;通常,這意味着「描述實際用例的大量例子」。所以我會說你只是提供你的服務所期望的JSON的完整例子,然後記錄這些屬性的目的就不會出錯。 – millimoose

回答

1

如果你的代碼表明你希望你的實例繼承外部對象,那麼一種方法是分配'class'的原型(注意在JS中用class來表達思想 - 它不是一個類Java等)的意義。

var obj = { 
    prop_1: 'foo', 
    prop_1: 'bar' 
} 
function Something() { 
    alert(this.prop_1); //alerts "foo" 
} 
Something.prototype = obj; 
var something = new Something(); 

這只是一種方式。有很多控制繼承的模式(以及其他模式,即使沒有接近繼承的概念,也能實現你想要的)。

至於push()不工作,在代碼中,Content是一個對象,而push()Array原型的方法。換句話說,你只能將push()轉換成一個數組。也許你的意思是Content.Item,這是一個數組。

最後,我會避免大寫名字。在JavaScript中,這往往只能用於類模擬中使用的函數(如ReceiveObj),以表示它們應該被實例化,而不僅僅是被調用。

+0

感謝您的幫助。目的不是繼承外部對象,而是指定ReceiveObj。內容是類型的(因此可以設置字段)內容。我知道它不能在JS中強制執行,因爲有人可以隨時更改類型,但它仍然可以是一個指示器,以記錄ReceiveObj包含的所有字段。關於推送,我想調用recObj.Content.push(anItem)。我認爲在我的定義中,數組沒有初始化。你是對的,我正在考慮通過其他OOP語言。 – bsr

+0

問題是你的'Content'屬性是一個對象,而不是一個數組,因此它沒有'push()'方法。數組是Content.Items而不是Content。在JavaScript中,初始化和聲明是一步,而不是兩步,所以一旦你聲明瞭你的數組就可以使用了。任何默認值(即'初始化')值都是您在創建時填充的值(在您的情況下,無)。 – Utkanos