私は、JavaScript オブジェクトを可能な限り「正しい」ものにしながら、可能な限り直感的に構築できるかどうかを試してきました。Crockford の JSLint.com でさまざまなシナリオを実行してきましたが、うまくいきませんでした。1 つのエラーを修正したようですが、変更により別のエラーが表示されます。以下は、私が得ることができるのとほぼ同じです。誰かがこれについて別の見方をしていますか?
これは、オブジェクトを構造化する典型的な方法です。
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 で実行すると、2 つのプライベート関数が「暗黙のグローバル」であるというエラーが表示されます。
私が思い付くことができる最善の方法は、次のような変数を使用して関数を上部に宣言することです。
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);
}
};
}