Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript对象是否需要封装?_Javascript_Node.js_Mongodb_Data Modeling - Fatal编程技术网

JavaScript对象是否需要封装?

JavaScript对象是否需要封装?,javascript,node.js,mongodb,data-modeling,Javascript,Node.js,Mongodb,Data Modeling,我正在开发node.js应用程序。正在寻找创建数据模型的方法 发送到客户机或从客户机发送的数据是JSON。因为数据库是MongoDb,所以从db到db的数据是JSON 我是JS新手,我可以找到很多专门用于创建封装对象的JS库。还需要吗 将模型定义为简单的js对象,并在必要时使用基于原型的继承,可能产生什么后果 感谢您的帮助。谢谢 将模型定义为简单js的可能结果是什么 对象,并在必要时使用基于原型的继承 在我看来,随着应用程序规模的增加,或者随着许多开发人员开始使用相同的代码,团队规模的增加,您将

我正在开发node.js应用程序。正在寻找创建数据模型的方法

发送到客户机或从客户机发送的数据是JSON。因为数据库是MongoDb,所以从db到db的数据是JSON

我是JS新手,我可以找到很多专门用于创建封装对象的JS库。还需要吗

将模型定义为简单的js对象,并在必要时使用基于原型的继承,可能产生什么后果

感谢您的帮助。谢谢

将模型定义为简单js的可能结果是什么 对象,并在必要时使用基于原型的继承

在我看来,随着应用程序规模的增加,或者随着许多开发人员开始使用相同的代码,团队规模的增加,您将逐渐失去可维护性

换句话说,如果没有适当的封装,很容易修改自己不拥有的对象,也很容易干预不想被触摸的部分

如果您正在编写某种库/框架,其中只有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将它们转换为可行的数组和对象

因此,第一种方法是创建“类实例”(不需要新的继承,只需要一个构造函数,它根据数据类型封装数据并公开接口)

<>我知道你已经知道这些东西了,但是考虑一下你在同一个过程中有两个或三个不同的数据类型(比如当你准备打印到客户端时),你有一个在每个对象上读写公共字段的过程。如果不同的对象具有不同的属性,那么事情就会以糟糕的结局结束,或者以一大堆鳞片状的
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) {}
...