【问题标题】:How to create global, instance based objects from local scope?如何从本地范围创建全局的、基于实例的对象?
【发布时间】:2012-07-28 14:54:30
【问题描述】:

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

我将此全局对象称为对象管道 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
        }
}

但现在返回对象在调用它的任何地方都在本地范围内。

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

我不确定我是不是想多了,或者我问的是可能的?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    私下持有您的包裹,并拥有一些访问功能:

    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();
    

    演示:http://jsfiddle.net/maniator/PSsQ3/

    【讨论】:

    • 所以每个“ele”都是一个带有值“value”的对象管道?
    • @HiroProtagonist 我更新了我的答案。 “对象管道”是什么意思?
    • 抱歉...这里有多少个 model_vars...我认为您不能拥有多个 b.c.你把它放在一个模块模式中......
    • @HiroProtagonist 查看我添加的演示。
    • 无论如何...你可以制作多个实例...用这个...只能有一个...b.c.是模块模式吗?
    【解决方案2】:

    你可以传入全局作用域,在需要的时候使用,像这样:

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

    【讨论】:

    • 这对单行返回语句有何影响?
    • window 在浏览器中是全局的 -- 哦等等这是 node.js 吗?
    • @HiroProtagonist - 它没有 - 在分配之前调用该函数。
    • 所以 return 语句仍然会转到调用它的地方....如何将这些对象弹出到全局空间中?
    • 这样的事情有可能吗?
    【解决方案3】:
    var msg = 'window is global in browsers';
    
    window.alert(msg);
    
    alert('or we can just use alert without accessing from window because, '+msg);
    
    function isWindowReallyGlobalInBrowsers(){
        window.newMsg = 'Did you see var newMsg get declared anywhere?';
        alert(newMsg + ' It works because ' +msg);
    }
    
    isWindowReallyGlobalInBrowsers();
    

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

    【讨论】:

    • 分配为 window 的属性使其在任何上下文中都是全局的。是的,msg 是在全局上下文中定义的,因此可以从任何地方访问。你可以提醒 window.msg 并获取 msg。
    • JS 不仅不是块作用域,而且是函数/构造函数作用域,并且内部函数可以访问父上下文中的所有内容。您可以更改外部范围内的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2014-04-11
    相关资源
    最近更新 更多