关于Javascript模型构建的问题

时间:2011-04-26 18:21:16

标签: javascript model-view-controller

我正在努力在我正在处理的网络应用上实现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();

只是尝试遵循最佳做法,避免使用错误的实施可能产生的任何问题。

2 个答案:

答案 0 :(得分:0)

这两种实现都是完全可以接受的。前者会更快,尽管可以忽略不计,但会将其内部暴露给世界。这意味着任何包含对PageInfo实例的引用的变量都将能够操作_info属性。通常这是一个非问题,因为带有下划线(_)的属性被认为是私有的,应该保持不变。

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

关于你的第二个问题,再次要么是可以接受的。我喜欢访问器方法的接口是一致的,所以我会说setInfo不应返回任何内容,但每条规则都有例外。当getInfo返回的值与传递给setInfo的值不一致时,会发生规则的例外情况。也就是说,如果getInfo返回的值不同于传递给setInfo的值,则可能需要返回setValue之外的值。否则,调用者只需重新使用传递给setValue的值,而不是调用getValue

答案 1 :(得分:-1)

第一个实现更好,就像在第二个实现中每次调用pageInfo函数一样,你定义了两个新函数(或设置一个闭包),而第一个实现是在原型中定义它们并重用。

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

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

假设setInfo返回undefined。