2012-12-25 39 views
1

我正在開發一個node.js應用程序。尋找創建數據模型的方法。JavaScript對象需要封裝嗎?

發送到/來自客戶端的數據是JSON。由於數據庫是MongoDb,數據到/從數據庫是JSON。

我是JS新手,我可以找到這麼多js庫專門用來創建封裝對象。它仍然是必需的嗎?

將模型定義爲簡單的js對象並在必要時使用基於原型的繼承可能會產生什麼結果?

任何幫助表示讚賞。謝謝。

回答

0

將模型定義爲簡單js 對象並在必要時使用基於原型的繼承可能會產生什麼結果?

IMO隨着應用程序大小的增加或隨着許多開發人員開始使用相同的代碼,您的團隊規模不斷增加,您將失去可維護性。

換句話說 - 沒有適當的封裝,很容易修改一個不屬於自己的物體 - 容易干擾你不想被觸摸的部分。

如果您正在編寫某種類型的庫/框架,其中只有API暴露給用戶,並且您沒有正確的封裝,則可能只需進行一次修改即可將所有內容都刪除。

例如:

var myObj = { 
    mySecretPrivateCrucialFunction: function() { 
     // all the awesome crucial logic 
    }, 
    //This is what you want other parts of the code ... 
    // ... to be interacting with in this object 
    myPublicMethod: function() { 
      // some logic 
     mySecretPrivateCrucialFunction(); 
      // some thing else 
    } 
} 

我可以做到這一點。

myObj.mySecretPrivateCrucialFunction = function() { 
    alert('yay..i got you..'); 
}; 

但是,如果你這樣做 - 你不會給那個機會。

var myObj = (function() { 
     var mySecretPrivateCrucialFunction = function() { 
       // all the awesome crucial logic 
      } 
     //This is what you want other parts of the code ... 
     // ... to be interacting with in this object 
     return { 
      myPublicMethod: function() {} /*some logic */ 
      mySecretPrivateCrucialFunction(); /*some thing else */ 
     } 
    })(); 

如果你想使你所有的屬性隱藏/私有,仍然希望獲取對象的JSON表示 - 你可以做這樣的事情 -

var myObj = (function() { 
    // your private properties 
    var prop1 = 1; 
    var prop2 = 2; 
    // your getters 
    var getProp1 = function() { 
      return prop1; 
     }; 
    var getProp2 = function() { 
      return Prop2; 
     }; 
    // your setters 
    var setProp1 = function (newValue) { 
      prop1 = newValue; 
     }; 
    var setProp2 = function (newValue) { 
      prop2 = newValue; 
     }; 
    // your JSON representation of the object 
    var toString = function() { 
      return JSON.stringify({ 
       prop1: prop1, 
       prop2: prop2 
      }); 
     }; 
    // Object that gets exposed - 
    return { 
     "getProp1": getProp1, 
     "getProp2": getProp2, 
     "setProp1": setProp1, 
     "setProp2": setProp2, 
     "toString": toString 
    } 
})(); 
+0

謝謝。我同意這一點。但是如果對象只有字段而沒有方法呢?爲了增加它,如果我像在java中一樣隱藏對象的所有成員,那麼JSON字符串會發生什麼? – sowdri

+0

如果我正確地理解了你的話,如果你隱藏所有的屬性private並且爲每個屬性設置getter和setter(比如在Java中),那麼你必須在Java對象中編寫你自己的'toString'函數,你可以使用它來獲取該對象的JSON表示。 –

+0

編輯我的答案給隱藏屬性的另一個例子。一探究竟。 –

0

有兩種方式我看到它處理這個問題:

我假設你的數據被轉移爲JSON
"[{\"key\":\"val\"}]"顯示在您的回覆中,然後您通過JSON.parse將它們變成可行的數組和對象。因此,第一種方法是製作「類實例」(不需要new或繼承,只是一個基於數據類型封裝數據和公開接口的構造函數)。

function makeTweet (data) { 
    var tweet = { 
      from_user : data.from_user || "anonymous", 
      /* ... */ 
     }, 

     toString = function() {}, 

     public_interface : { 
      toString : toString, 
      /* getters, etc */ 
     }; 
    return public_interface; 
} 

我知道你已經知道這個東西,但考慮到在這裏你有兩個或三個不同的數據類型相同的進程內(如在該行的最後一種情況,當你準備好打印到客戶端),並且您有一個讀寫每個對象公共字段的過程。如果不同的物體具有不同的屬性,事情就會很糟糕,或者以一片平易近人的聲音結束。

另一種方式來看待它可能是一個實體/服務體系

function handleTweets (tweetArr) { 
    var templateFormat = system.output_format, 
     string = ""; 

    if (templateFormat === "HTML") { 
     string = HTMLtemplateTweets(tweetArr); 
    } else { /* ... */ } 
} 

function HTMLtemplateTweets (tweetArr) {} 
function JSONtemplateTweets (tweetArr) {} 
function XMLtemplateTweets (tweetArr) {} 
... 

有了一點是,你會打開JSON字符串僅數據對象的數組,並給他們下了特定類型的庫/系統函數。

這將更像是一個非常簡化的實體/系統方法,而不是OO(如經典接受)的方法。

現在,您的數據安全來自於確保您的對象只能沿着預期的路徑下降,因此對於該類型的每個對象而言,變換都是可預測的。

如果你想在JS中爲了性能/內存目的而使用「繼承」,那麼這可能也是一個看起來的方向。