【问题标题】:Question about Javascript model construction关于Javascript模型构建的问题
【发布时间】:2011-04-26 18:21:16
【问题描述】:

我正在致力于在我正在开发的网络应用程序上实现 Javascript 模型。该模型的目的是简单地保存有关页面状态的信息。我遇到了两种不同的创建模型的实现,我想知道哪一个最好用。第一个实现:

var PageInfo = function () {
    this._info = {}; 
};

PageInfo.prototype = {
    getInfo: function () {
        return this._info;
    },
    setInfo: function (updatedInfo) {
        this._info = updatedInfo;
    }
};

第二个实现:

var pageInfo = function () {
    var info = {};

    return {
        getInfo: function () {
            return info;
        },
        setInfo: function (updatedInfo) {
            info = updatedInfo;
        }
    }
};

我的另一个问题是关于 setInfo() 函数。当我发现自己在更新模型时,我经常希望我刚刚更改的信息能够立即提供给我。这导致我这样编写 setter 函数:

setInfo: function(updatedInfo) {
    info = updatedInfo;
    return info;
}

我在代码中这样实现:

var info = pageInfo.setInfo(newInfo);

这样可以吗,还是我应该这样实现?:

pageInfo.setInfo(newInfo);
var info = pageInfo.getInfo();

只是尝试遵循最佳实践并避免使用错误实现可能出现的任何问题。

【问题讨论】:

    标签: javascript model-view-controller


    【解决方案1】:

    这两种实现都是完全可以接受的。前者会更快,尽管速度可以忽略不计,但会将其内部结构暴露给世界。这意味着任何持有对PageInfo 实例的引用的变量都将能够操纵_info 属性。一般来说,这不是问题,因为带有下划线 (_) 的属性被认为是私有的,应该不理会。​​p>

    后一种实现使用了一个称为闭包的概念。当返回的值保持对其定义范围的引用时,就会形成一个闭包。本质上,这意味着info 变量保持活动状态。由于该变量是“封闭的”,因此不可能在您提供的接口方法之外对其进行修改。根据我的经验,这很少需要。

    关于您的第二个问题,同样可以接受。我喜欢访问器方法的接口是一致的,所以我想说setInfo 不应该返回任何东西,但每个规则都有例外。当getInfo 返回的值与传递给setInfo 的值不一致时,就会出现该规则的例外情况。也就是说,如果getInfo 返回的值与传递给setInfo 的值不同,您可能希望从setValue 返回值。否则,调用者可以简单地重新使用传递给setValue 的值,而不是调用getValue

    【讨论】:

    • 我有一个关于在变量名中使用下划线 (_) 的问题。这只是一种风格选择吗?
    • 是的,语言没有强制要求。如果我不得不猜测,我会说它是受 Python 启发的。
    【解决方案2】:

    第一个实现更好,因为在第二个实现中,每次调用 pageInfo 函数时,您都定义了 2 个新函数(或设置了一个闭包),而第一个实现是在原型中定义它们并重用。

    对于其他问题,如果您这样做只是为了保留线条,我可能会建议:

    var info = pageInfo.setInfo(newInfo) || pageInfo.getInfo();

    假设 setInfo 返回 undefined。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 2020-10-08
      • 2016-02-16
      • 1970-01-01
      相关资源
      最近更新 更多