2013-01-31 78 views
0

屬性的getter和setter聲明是否正確且最有效?爲JavaScript對象定義屬性

var AxisRange = (function(){ 
    function AxisRange(){ 
     this._userMaxValue = 0.0; 

     Object.defineProperty(AxisRange.prototype, "UserMaxValue", { 
      get : function(){ 
       return this._userMaxValue; 
      }, 
      set : function(value){ 
       if(value != this._userMaxValue){ 
        this._userMaxValue = value; 
        this.validateUserMaxValue(); 
        this.validateUserStep(); 

        this.synchronizeActualRange(); 
       } 
      } 
     }); 
    } 

    AxisRange.prototype.validateUserMaxValue = function(){ 
     alert("validateUserMaxValue"); 
    }; 

    return AxisRange; 
})(); 

而且,我使用JetBrains公司WebStorm寫我的JS代碼,並警告我說,

  1. Object.defineProperty使用AxisRange.prototype是不能分配給參數類型的對象。
  2. in line if(value != this._userMaxValue) is said「可能的非法使用此。」

在繼續進行代碼輸入之前,我需要確保我使用的是正確的。

+0

您應該將'Object.defineProperty'調用移到構造函數的外部,但除此之外它看起來很好。 –

+0

http://www.w3schools.com/js/js_objects.asp幫助瞭解如何定義對象,屬性和方法 – SoluableNonagon

+0

並且我同意Felix,getter/setter函數應該與validateUserMaxValue – SoluableNonagon

回答

0

您正在構造函數中定義一個原型屬性。這意味着每次創建新的AxisRange對象時都會重新定義它。將其移出構造函數。

您也可能想要擺脫那個閉包,因爲您沒有使用它來命名空間任何局部變量,並且它會使優化JavaScript的嘗試複雜化。 (如果您曾經使用Google Closure編譯器,會特別抱怨。)

+0

會是這樣一個代碼'http:// pastebin.com/fzdUUHD1'是否正確?它雖然可以像預期的那樣工作,但在Object.defineProperty中使用'AxisRange.prototype'時仍然會發出警告。但如果我用'this'替換它,那麼setter將不會被調用。 – Eugen

+0

看起來很好。我從來沒有使用JetBrains WebStorm,所以不知道它在抱怨什麼。也許它希望你明確地設置AxisRange變量:var AxisRange = function AxisRange()? –