0

所以我正在使用一个函数来更新我的值,但我无法将它们取回。我看到值没有得到更新,但是有没有办法将它们保存为对函数返回的引用。

function Amphibia(wheelRadius, finsPerPropeller, propellersSpinDirection, mode) {

        this.speed = 0;
        this.mode = mode;

        var amphibiaWheel = new PropulsionUnits.Wheel(wheelRadius);
        var amphibiaPropeller = new PropulsionUnits.Propeller(finsPerPropeller, propellersSpinDirection);

        this.changeMode = function () {
            if (mode == "land") {

                mode = "water";
            }

            else if(mode == "water") {

                mode = "land";
            }

            return {

                mode: mode
            }
        }

        this.accelerate = function() {
            if(this.mode == "water"){
                this.speed += amphibiaPropeller.acceleration;
            }
            else if(this.mode == "land"){
                this.speed += 4*amphibiaWheel.acceleration;
            }
        }

        this.changePropellerSpinDirection = function() {

            amphibiaPropeller.changeSpinDirection();
        }

        return {

            speed: this.speed,
            mode: this.mode,
            changeMode: this.changeMode,
            accelerate: this.accelerate,
            changePropellerSpinDirection: this.changePropellerSpinDirection
        }

    }

所以在这里我遇到了更改模式和 changeMode 函数表达式的问题。其中的模式应该引用 this.mode 然后我应该能够更新该值。

4

2 回答 2

1

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

在提及事物的方式上保持一致。
不要混用selfand 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,那么您一定会遇到一些惊喜。

于 2014-02-18T22:50:24.027 回答
0

我自己找到了答案!:) 所以基本上函数构造函数中的 this 指的是 Amphibia,而 this.changeMode 函数表达式中的 this 指的是对象窗口。因此我们可以定义一个变量 self = this; 在构造函数中,所以我们可以在函数表达式中引用相同的东西,就像在函数中一样。我解释得有点糟糕,但这是我的固定代码;)

function Amphibia(wheelRadius, finsPerPropeller, propellersSpinDirection, mode) {

        this.speed = 0;
        var self = this;
        self.mode = mode;

        var amphibiaWheel = new PropulsionUnits.Wheel(wheelRadius);
        var amphibiaPropeller = new PropulsionUnits.Propeller(finsPerPropeller, propellersSpinDirection);

        this.changeMode = function () {


            if (self.mode == "land") {

                self.mode = "water";
            }

            else if(self.mode == "water") {

                self.mode = "land";
            }

        }

        this.accelerate = function() {
            if(self.mode == "water"){
                this.speed += amphibiaPropeller.acceleration;
            }
            else if(self.mode == "land"){
                this.speed += 4*amphibiaWheel.acceleration;
            }
        }

        this.changePropellerSpinDirection = function() {

            amphibiaPropeller.changeSpinDirection();
        }

        return {

            speed: this.speed,
            mode: this.mode,
            changeMode: self.changeMode,
            accelerate: this.accelerate,
            changePropellerSpinDirection: this.changePropellerSpinDirection
        }

    }
于 2014-02-18T23:13:42.613 回答