Javascript 如何从局部范围创建全局的、基于实例的对象?

Javascript 如何从局部范围创建全局的、基于实例的对象?,javascript,Javascript,我使用一个全局对象。我知道使用全局对象的缺点,但在这种情况下,我想使用它 我把这个全局对象称为对象管道b.c.它把我的模型分支到我的控制器,反之亦然…也许应该叫它对象分支…无论如何 我犯的错误是,我以为我在任何给定的时间只有一个模型在运行…但我没有,有多个 因此,我不能使用单个静态实现,我需要一个基于实例的实现,每个运行的模型一个全局对象管道 这是静态版本。MC代表模型/控制器 /**********************************************************

我使用一个全局对象。我知道使用全局对象的缺点,但在这种情况下,我想使用它

我把这个全局对象称为对象管道b.c.它把我的模型分支到我的控制器,反之亦然…也许应该叫它对象分支…无论如何

我犯的错误是,我以为我在任何给定的时间只有一个模型在运行…但我没有,有多个

因此,我不能使用单个静态实现,我需要一个基于实例的实现,每个运行的模型一个全局对象管道

这是静态版本。MC代表模型/控制器

/********************************************************************************************
 *
 * MC - Model/Controller Types
 *
 *******************************************************************************************/

var MC = {};

/**
 **  Object Pipe
 */

MC.o_p = {
    model  :  'default',
    result :  'continue',
    page   :  {},
    args   :  {},
    server :  {},
    hash   :  localStorage.hash
};
我想做这样的事情:

MC.o_p1 = function() {
    return {
        model  :  'default',
        result :  'continue',
        page   :  {},
        args   :  {},
        server :  {},
        hash   :  localStorage.hash
        }
}
MC.o_p1 = function(global) {
    return {
        model  :  'default',
        result :  'continue',
        page   :  {},
        args   :  {},
        server :  {},
        hash   :  global.localStorage.hash
        }
}(window);
但现在,返回对象位于任何调用它的对象的局部范围内

我需要基于全局实例的对象


我不确定我是否考虑过这一点,或者我问的是可能的?

私下拿着你的包,只需要一些访问功能:

var myModel = (function() {

    var model_vars = {
        model: 'default',
        result: 'continue',
        page: {},
        args: {},
        server: {},
        hash: localStorage.hash
    };

    return function() {
        this.get = function(ele) {
            if (model_vars.hasOwnProperty(ele)) {
                return model_vars[ele];
            }

        };

        this.set = function(ele, value) {
            if (model_vars.hasOwnProperty(ele)) {
                return model_vars[ele] = value;
            }

        };

    };

})();
然后你可以做:

Model = new myModel();

演示:

私下拿着你的软件包,只需使用一些访问功能:

var myModel = (function() {

    var model_vars = {
        model: 'default',
        result: 'continue',
        page: {},
        args: {},
        server: {},
        hash: localStorage.hash
    };

    return function() {
        this.get = function(ele) {
            if (model_vars.hasOwnProperty(ele)) {
                return model_vars[ele];
            }

        };

        this.set = function(ele, value) {
            if (model_vars.hasOwnProperty(ele)) {
                return model_vars[ele] = value;
            }

        };

    };

})();
然后你可以做:

Model = new myModel();

演示:

您可以传入全局范围,并在需要时使用它,如下所示:

MC.o_p1 = function() {
    return {
        model  :  'default',
        result :  'continue',
        page   :  {},
        args   :  {},
        server :  {},
        hash   :  localStorage.hash
        }
}
MC.o_p1 = function(global) {
    return {
        model  :  'default',
        result :  'continue',
        page   :  {},
        args   :  {},
        server :  {},
        hash   :  global.localStorage.hash
        }
}(window);

您可以传入全局范围,并在需要时使用它,如下所示:

MC.o_p1 = function() {
    return {
        model  :  'default',
        result :  'continue',
        page   :  {},
        args   :  {},
        server :  {},
        hash   :  localStorage.hash
        }
}
MC.o_p1 = function(global) {
    return {
        model  :  'default',
        result :  'continue',
        page   :  {},
        args   :  {},
        server :  {},
        hash   :  global.localStorage.hash
        }
}(window);
在浏览器控制台中尝试。根据需要提问



在浏览器控制台中尝试。根据需要提问。

所以每个“ele”都是一个具有值“value”的对象管道?@hiroprotation我更新了我的答案。你说的“对象管道”是什么意思?对不起…这里有多少个模型变量…我不认为你可以有多个b.c.你把它放在一个模块模式中…@hiroprogator请看我添加的演示。不管怎样…你可以制作多个实例…用这个…只能有一个…b.c。这是模块模式?所以每个“ele”都是一个具有值“value”的对象管道?@hiroprogator我更新了我的答案。你说的“对象管道”是什么意思?对不起…这里有多少个模型变量…我不认为你可以有多个b.c.你把它放在一个模块模式中…@hiroprogator请看我添加的演示。不管怎样…你可以制作多个实例…用这个…只能有一个…b.c。这是模块模式?这对一行返回语句有什么影响?窗口在浏览器中是全局的——哦,等等,这是node.js吗?@hiroprotation-它没有——函数在赋值之前就被调用了。所以返回语句仍然会指向调用它的地方……我如何将这些对象弹出到全局空间?有可能这样做吗事情?这对一行返回语句有什么影响?窗口在浏览器中是全局的——哦,等等,这是node.js吗?@hiroprotation-它没有——函数在赋值之前就被调用了。所以返回语句仍然会转到调用它的地方……我如何将这些对象弹出到全局空间?有可能这样做吗?赋值作为window的一个属性,它在任何上下文中都是全局的。是的,msg是在全局上下文中定义的,因此它可以从任何地方访问。您可以向window.msg发出警报并获取消息。msg.JS不仅不在块范围内,而且在函数/构造函数范围内,内部函数可以访问父上下文中的所有内容。您可以在外部作用域中更改内容。将其指定为window的属性将使其在任何上下文中都是全局的。是的,msg是在全局上下文中定义的,因此它可以从任何地方访问。您可以向window.msg发出警报并获取消息。msg.JS不仅不在块范围内,而且在函数/构造函数范围内,内部函数可以访问父上下文中的所有内容。您可以在外部范围内更改内容。