我正在努力在我正在处理的网络应用上实现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 :(得分:0)
这两种实现都是完全可以接受的。前者会更快,尽管可以忽略不计,但会将其内部暴露给世界。这意味着任何包含对PageInfo
实例的引用的变量都将能够操作_info
属性。通常这是一个非问题,因为带有下划线(_)的属性被认为是私有的,应该保持不变。
后一种实现使用了一种叫做闭包的概念。当返回一个值以保持对其定义范围的引用时,将形成闭包。基本上它意味着info
变量保持活跃。由于变量是“封闭的”,因此不可能在您提供的接口方法之外进行修改。根据我的经验,这很少需要。
关于你的第二个问题,再次要么是可以接受的。我喜欢访问器方法的接口是一致的,所以我会说setInfo
不应返回任何内容,但每条规则都有例外。当getInfo
返回的值与传递给setInfo
的值不一致时,会发生规则的例外情况。也就是说,如果getInfo
返回的值不同于传递给setInfo
的值,则可能需要返回setValue
之外的值。否则,调用者只需重新使用传递给setValue
的值,而不是调用getValue
。
答案 1 :(得分:-1)
第一个实现更好,就像在第二个实现中每次调用pageInfo函数一样,你定义了两个新函数(或设置一个闭包),而第一个实现是在原型中定义它们并重用。
对于其他问题,如果你只是这样做以保留线条,我可能会建议:
var info = pageInfo.setInfo(newInfo)|| pageInfo.getInfo();
假设setInfo返回undefined。