mode
并且this.mode
不一样。在您的函数中,您分别在mode
和上检查/设置值this.mode
。
只要您在同一个地方以相同的方式使用其中一个或另一个,两者都应该可以正常工作。
编辑
var Amphibia = function (wheelRadius, finsPerPropeller, propellersSpinDirection, mode) {
var amphibia = this,
MODES = { LAND : "land", WATER : "water" };
amphibia.getMode = function () { return mode; };
amphibia.setMode = function (val) { mode = val; };
amphibia.changeMode = function () {
amphibia.setMode((mode === MODES.LAND) ? MODES.WATER : MODES.LAND);
};
};
var amphibia = new Amphibia("", "", "", "land");
amphibia.getMode(); // "land"
amphibia.changeMode();
amphibia.getMode(); // "water"
mode
现在是 100% 私有的,并且对于该实例是唯一的。
如果你不需要它,那么你可以将它附加到this
,如果你愿意的话。
但这是你的问题:
var Amphibia = function () {
var amphibia = this,
amphibiaPropeller = new Propeller( );
// mode, getMode, setMode, etc...
amphibia.accelerate = function () {
if (amphibia.getMode() === "water") {
this.speed += amphibiaPropeller.acceleration;
}
};
};
var amphibia = new Amphibia();
var bob = { speed : 0 };
bob.accelerate = amphibia.accelerate;
bob.accelerate();
// if amphibia.mode === "water", bob.speed += amphibiaPropeller.acceleration
bob.speed; // === amphibiaPropeller.acceleration
setTimeout(amphibia.accelerate, 10); // call amphibia.accelerate in ~10ms
// if amphibia.mode === "water", window.speed += amphibiaPropeller.acceleration
window.speed; // === amphibiaPropeller.acceleration
在提及事物的方式上保持一致。
不要混用self
and this
,除非你打算得到那些副作用......
除非你有一个非常非常好的理由这样做(比如你正在构建一个框架/引擎,而不是游戏的模块/类/simulation使用引擎;即:构建 jQuery 和使用jQuery构建某些东西之间的区别),那么您可能应该避免这样做。
如果您有想要向外界公开的闭包(“私有”)状态,那么您所需要的只是一个返回该值的函数,和/或设置它的函数。
突然之间self
,andthis
和 what is which, when, 之间的差异都消失了,只要你使用它们的方式保持一致,并且你知道this
每次调用方法时的 value 将是什么.
请注意,我没有返回任何内容...
当我使用new
时,默认情况下会返回this
( amphibia
/ ) 的值。self
如果你想使用私有值,并返回一个“显示模块”(这是我通常喜欢的),那么你可以简单地这样做:
var Amphibia = function (mode) {
var getMode = function () { return mode; },
setMode = function (val) { mode = val; },
changeMode = function () {
setMode( mode === "water" ? "land" : "water" );
};
return {
getMode : getMode,
setMode : setMode,
changeMode : changeMode
};
};
var amphibia = new Amphibia("water");
// `new` won't do any harm, but you can also not use it,
// without it saving everything to `window`
amphibia.getMode(); // "water"
amphibia.changeMode();
amphibia.getMode(); // "land"
或者,如果你想让它看起来更像一个模块/组件......
return {
mode : { get : getMode, set : setMode, switch : changeMode }
};
var amphibia = Amphibia("land");
amphibia.mode.get(); // "land"
amphibia.mode.switch();
amphibia.mode.get(); // "water"
var bob = { };
bob.switchAmphibiaMode = amphibia.mode.switch;
bob.switchAmphibiaMode();
amphibia.mode.get(); // "land"
setTimeout(amphibia.mode.switch, 10);
setTimeout(function () { console.log(amphibia.mode.get()); }, 20);
// 10ms amphibia.mode.switch();
// 20ms console.log(amphibia.mode.get());
// > "water"
...或您想要的任何其他结构。
你根本不需要this
。
但是this
在 JavaScript 中需要非常非常小心,因为this
每次调用函数时,含义都会发生变化,如果一半代码使用this
一半使用self
,那么您一定会遇到一些惊喜。