我正在開發一個node.js應用程序。尋找創建數據模型的方法。JavaScript對象需要封裝嗎?
發送到/來自客戶端的數據是JSON。由於數據庫是MongoDb,數據到/從數據庫是JSON。
我是JS新手,我可以找到這麼多js庫專門用來創建封裝對象。它仍然是必需的嗎?
將模型定義爲簡單的js對象並在必要時使用基於原型的繼承可能會產生什麼結果?
任何幫助表示讚賞。謝謝。
我正在開發一個node.js應用程序。尋找創建數據模型的方法。JavaScript對象需要封裝嗎?
發送到/來自客戶端的數據是JSON。由於數據庫是MongoDb,數據到/從數據庫是JSON。
我是JS新手,我可以找到這麼多js庫專門用來創建封裝對象。它仍然是必需的嗎?
將模型定義爲簡單的js對象並在必要時使用基於原型的繼承可能會產生什麼結果?
任何幫助表示讚賞。謝謝。
將模型定義爲簡單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
}
})();
有兩種方式我看到它處理這個問題:
我假設你的數據被轉移爲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中爲了性能/內存目的而使用「繼承」,那麼這可能也是一個看起來的方向。
謝謝。我同意這一點。但是如果對象只有字段而沒有方法呢?爲了增加它,如果我像在java中一樣隱藏對象的所有成員,那麼JSON字符串會發生什麼? – sowdri
如果我正確地理解了你的話,如果你隱藏所有的屬性private並且爲每個屬性設置getter和setter(比如在Java中),那麼你必須在Java對象中編寫你自己的'toString'函數,你可以使用它來獲取該對象的JSON表示。 –
編輯我的答案給隱藏屬性的另一個例子。一探究竟。 –