2014-02-17 39 views
0

所以基本上,this.acceleration不會更新,無論我做什麼。我需要一種方法來讓一個函數更新它的值,所以當它們從另一個函數改變時,它仍然可以正常工作。這裏是我的意思是:函數表達式不更新值,只能調用一次函數表達式(模塊)

function PropellingNozzle(power) { 

    this.power = power; 
    this.afterburner = "off"; 

    function acceleration (afterburner, power) { 

     this.afterburner = afterburner; 
      console.log(this.power); 
     if(this.afterburner == "on") { 
      this.acceleration = this.power*2; 
     } 
     else if(this.afterburner == "off") { 
      this.acceleration = this.power; 
     } 
      console.log("called"); 
      return this.acceleration 
    } 


    return { 

     power: this.power, 
     afterburner: this.afterburner, 
     switchAfterburner: function() { 
      if(this.afterburner == "off") { 
        this.afterburner = "on"; 
       } 

       else if(this.afterburner == "on") { 
        this.afterburner = "off"; 
       } 
     }, 
     acceleration: acceleration(this.afterburner, this.power) 
    }; 
} 

正如你所看到的,我知道開始分析的價值和什麼沒有,只是試驗階段,因此仍然無法正常工作。 Here是jsfiddle中測試的整個代碼部分。優先考慮的是,switchAfterburner也應該在PropellingNozzle函數中,但是如果它不起作用,它就不會有任何問題留在返回中。我的任務是儘可能以我的知識編寫面向對象的代碼

+0

你的小提琴的這部分沒有意義'var nozzle = new propulsionUnits.PropellingNozzle(20);'。 'propulsionUnits'是指一個對象,而不是一個構造函數。 – linstantnoodles

+0

propulsionUnits是我所謂的模塊。 propulsionUnits.PropellinNozzle應該引用PropellingNozzle函數,它確實是一個構造函數。這部分已經過測試並且工作正常,如果你可以幫我解決我的問題,我將對它進行補充 – user3127242

+0

如果你想用函數作爲'new'的構造函數,你不應該返回一個對象(不是問題的根源,但令人困惑)。 – Bergi

回答

0

只調用一次 - 將值分配給acceleration屬性時。只要其中一個值發生變化,您就不會分配函數表達式來重新評估,但是您正在分配其結果值。

那麼該怎麼辦?您可以

  • 更新acceleration屬性,只要其中一個值取決於其更改。當它們僅由您的函數設置(如switchAfterBurner)而不是從外部直接分配時,很容易將重新計算放在這些設置器中。
  • 使用getter方法進行加速。而不是僅僅讀取一個屬性,外部將調用getAcceleration()函數,該函數動態計算正確的值。

順便說一句,請使用任一

function PropellingNozzle(power) { 
    this.power = power; 
    this.afterburner = "off"; 
    this.switchAfterburner = function() {…}; 
    … 
} 
var example = new PropellingNozzle(…); 

function makePropellingNozzle(power) { 
    … 
    return { 
     power: power, 
     afterburner: "off", 
     switchAfterburner: function() {…}, 
     … 
    }; 
} 
var example = makePropellingNozzle(…); 

而不是兩者的混合物。