2011-04-26 87 views
0

我正在对正在处理的Web应用程序实现Javascript模型。该模型的目的是简单地保存关于页面状态的信息。我已经遇到了两种不同的创建模型的实现,我想知道哪一个最适合使用。第一个实现:关于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(); 

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

回答

0

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

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

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

+0

我有一个关于在变量名中使用下划线(_)的问题。这只是一种文体选择? – 2011-04-26 18:48:10

+0

是的,语言没有强制执行。如果我不得不猜测我会说它是受Python启发的。 – 2011-04-26 19:47:31

-1

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

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

VAR信息= pageInfo.setInfo(newInfo)|| pageInfo.getInfo();

假设setInfo返回未定义。