【发布时间】:2010-07-10 04:09:03
【问题描述】:
我一直在尝试查看是否可以尽可能直观地构建我的 JavaScript 对象,同时确保它尽可能“正确”。我一直在通过 Crockford 的 JSLint.com 运行一堆不同的场景,但运气不佳。我似乎修复了一个错误,然后由于更改而弹出另一个错误。下面是我能得到的最好的。有人对此有其他看法吗?
这是我构造对象的典型方式:
function gizmo(id) {
/* private variables */
var myId = id;
/* private methods */
var init = function () {
if (myId < 1) {
setId(1);
}
};
var setId = function (newId) {
myId = newId;
};
// run 'constructor'
init();
/* public methods */
return {
getId: function () {
return myId;
},
setId: function (newId) {
setId(newId);
},
incrementId: function (inc) {
setId(myId + inc);
}
};
}
// creating an instance of gizmo
var myGizmo = gizmo(-2);
console.log(myGizmo.getId()); // outputs 1
myGizmo.setId(5);
console.log(myGizmo.getId()); // outputs 5
myGizmo.incrementId(2);
console.log(myGizmo.getId()); /// outputs 7
这似乎运作良好。但是,当我通过 JSLint 运行它时,它给了我一个错误,指出我的两个私有函数是“隐含全局函数”。
我能想到的最好办法是在顶部声明我的函数,并使用如下变量:
function gizmo(id) {
/* private variables */
var myId = id,
init,
setId;
/* private methods */
init = function () {
if (myId < 1) {
setId(1);
}
};
setId = function (newId) {
myId = newId;
};
// run 'constructor'
init();
/* public methods */
return {
getId: function () {
return myId;
},
setId: function (newId) {
setId(newId);
},
incrementId: function (inc) {
setId(myId + inc);
}
};
}
【问题讨论】:
-
这与其说是一个答案,不如说是一个建议。不要太担心 jsLint。我经常觉得它太严格了。而是专注于编程。也就是说,我会让其他人讨论最佳实践。
-
同意。我没有过分强调它。我只是根据我在互联网上在这里和那里学到的知识来构建我的代码。过去几天我一直在玩 JSLint,并有兴趣让其他人接受这一切。
-
问题在于 init 和你的函数的顺序。在返回它将通过的对象之前移动 init。另外我认为你不需要函数 init。也许作为一个自动执行和匿名的 fn 只是为了分离事物。
标签: javascript jslint