2013-01-24 90 views
0

我試圖創建與公共方法和公共變量JavaScript對象:JavaScript對象和公共變量

jeeni.DataGrid = (function(elementId){ 
    var divId = elementId; 
    var div; 
    var saveUrl; 
    var columns; 
    var dataUrl; 

    var validate = function(){ 
     console.log("divId: " + (divId)); 
     console.log("div: " + div); 
     console.log("saveUrl: " + saveUrl); 
     console.log("columns: " + columns); 
     console.log("dataUrl: " + dataUrl); 
    }; 

    return { 
     toString:validate, 
     dateURL:dataUrl, 
     saveURL:saveUrl, 
     columnDefs:columns 
    }; 

}); 

,我使用它是這樣的:

<script> 
    $(document).ready(function() { 

     var grid = new jeeni.DataGrid("myDataGrid"); 

     grid.saveURL = "http://www.jeeni.co.uk/grid/save"; 
     grid.dataURL = "http://www.jeeni.co.uk/grid/data"; 
     grid.columnDefs = "[{text:'Column1',width:75}, {text:'Column2',width:150}]"; 
     grid.toString(); 
    }); 
</script> 

但在控制檯上我得到:

divId: myDataGrid 
div: undefined 
saveUrl: undefined 
columns: undefined 
dataUrl: undefined 

任何人都可以解釋爲什麼不確定的變量是不確定的。回報不公開嗎?我怎樣才能讓他們分配而不必使用getter和setter。

謝謝

+0

_「不返回使它們公開嗎?」_否它返回這些變量的當前值(所有這些變量都是未定義的),它不返回對這些變量的引用。你必須使用getters和setter,或者使用屬性來代替變量(即'this.saveUrl'而不是''''''''''''''''''''''''''' 'toString:validate'部分是不同的,因爲'validate'是一個對象。 – nnnnnn

回答

1

您目前正在使用私有變量,提取VALUES並將其返回到對象中。你要返回的對象沒有對私有變量的引用,它只是有一個副本。當你調用你的函數後重新賦值時,你只會改變副本,而不是私有變量。

您需要做的是將數據直接存儲在對象上,因爲對象上的所有屬性都通過REFERENCE來檢索。例如:

jeeni.DataGrid = function(elementId){ 

    // These are private 
    var divId = elementId; 
    var div; 

    var public = { 
     "toString" : validate, 
     "dateURL" : null, 
     "saveURL" : null, 
     "columnDefs" : null 
    }; 

    function validate(){ 
     console.log("divId: " + divId); 
     console.log("div: "  + div); 
     console.log("saveUrl: " + public.saveURL); 
     console.log("columns: " + public.columnDefs); 
     console.log("dataUrl: " + public.dataURL); 
    }; 

    return public; 

}; 
+0

正是我想找的 –

+0

不客氣;-) – THEtheChad

0

您的模式建立私人領域(這通常是它使用的主要原因)。所以當你做

grid.saveURL = ... 

你只是增加一個新的領域,而不是改變現有的隱藏的一個。

如果你想公共領域,這樣做:

jeeni.DataGrid = function(elementId){ 
    this.divId = elementId; 
}; 
jeeni.DataGrid.prototype.validate = function(){ 
    console.log("divId: " + (this.divId)); 
    console.log("div: " + this.div); 
    console.log("saveUrl: " + this.saveUrl); 
    console.log("columns: " + this.columns); 
    console.log("dataUrl: " + this.dataUrl); 
}; 

如果你要保持你的私人領域,那麼你就必須添加函數來改變他們,但是這將是你的情況加重。

0

如果要立即調用該函數並將返回的對象指定給jeeni.DataGrid,則需要在函數聲明的末尾添加()。例如,

var obj = (function (someArg1) { 
    return { pubVar1 : someArg1 }; 
}("Hello World")); 

//Alerts "Hello World". 
alert(obj.pubVar1); 

爲了測試你的函數/變量的返回值,你可以隨時使用console.log(obj)並檢查瀏覽器的調試控制檯上的輸出(如果你使用的是Chrome F12通常會顯示此控制檯)。

希望這會有所幫助!