JavaScript对象是否需要封装?
我正在开发node.js应用程序。正在寻找创建数据模型的方法 发送到客户机或从客户机发送的数据是JSON。因为数据库是MongoDb,所以从db到db的数据是JSON 我是JS新手,我可以找到很多专门用于创建封装对象的JS库。还需要吗 将模型定义为简单的js对象,并在必要时使用基于原型的继承,可能产生什么后果 感谢您的帮助。谢谢 将模型定义为简单js的可能结果是什么 对象,并在必要时使用基于原型的继承 在我看来,随着应用程序规模的增加,或者随着许多开发人员开始使用相同的代码,团队规模的增加,您将逐渐失去可维护性 换句话说,如果没有适当的封装,很容易修改自己不拥有的对象,也很容易干预不想被触摸的部分 如果您正在编写某种库/框架,其中只有API向用户公开,并且您没有适当的封装,那么可能只需修改一次就可以将所有内容都破坏掉 例如:JavaScript对象是否需要封装?,javascript,node.js,mongodb,data-modeling,Javascript,Node.js,Mongodb,Data Modeling,我正在开发node.js应用程序。正在寻找创建数据模型的方法 发送到客户机或从客户机发送的数据是JSON。因为数据库是MongoDb,所以从db到db的数据是JSON 我是JS新手,我可以找到很多专门用于创建封装对象的JS库。还需要吗 将模型定义为简单的js对象,并在必要时使用基于原型的继承,可能产生什么后果 感谢您的帮助。谢谢 将模型定义为简单js的可能结果是什么 对象,并在必要时使用基于原型的继承 在我看来,随着应用程序规模的增加,或者随着许多开发人员开始使用相同的代码,团队规模的增加,您将
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将它们转换为可行的数组和对象
因此,第一种方法是创建“类实例”(不需要新的继承,只需要一个构造函数,它根据数据类型封装数据并公开接口)
<>我知道你已经知道这些东西了,但是考虑一下你在同一个过程中有两个或三个不同的数据类型(比如当你准备打印到客户端时),你有一个在每个对象上读写公共字段的过程。如果不同的对象具有不同的属性,那么事情就会以糟糕的结局结束,或者以一大堆鳞片状的If
语句结束
另一种看待它的方式可能是实体/服务系统
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字符串会发生什么?如果我理解正确,如果你像在java中一样隐藏所有私有属性并为每个属性设置getter和setter,你必须像在java中一样在该对象中编写自己的“toString”函数,您可以使用它来获取该对象的JSON表示形式。编辑我的答案以给出另一个具有隐藏属性的示例。看看吧,模块模式已经过时了,它是在所有人都试图封装和保护东西的时候创建的,这是由于oop语言的严重影响。今天,没有人这样做,按原样使用javascript,不要试图对自己进行封装和保护。事实上的标准是:“在变量名称前加下划线以创建私有变量”,这就是JS中需要的所有内容。@Gabrel Llamas-“事实上的标准”是您不能严格执行的,并且容易被滥用,上述方法将解决我在大型应用程序中的一些维护问题。根据你的观察“今天没有人这样做”——我不认为这是事实,而且这不是一个传播我个人观点的论坛,听说过requireJS和它的流行吗?
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) {}
...