0

我正在尝试使用公共方法和公共变量创建一个 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 的情况下让它们可分配。

谢谢

4

3 回答 3

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;

};
于 2013-01-24T08:10:12.727 回答
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);
};

如果你想保持你的字段私有,那么你必须添加函数来改变它们,但在你的情况下这会更重。

于 2013-01-24T08:00:36.680 回答
0

如果要()立即调用函数并将返回的对象分配给jeeni.DataGrid. 例如,

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

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

要测试函数/变量的返回值,您可以随时使用console.log(obj)并检查浏览器调试控制台上的输出(如果您使用的是 Chrome F12,通常会显示此控制台)。

希望这可以帮助!

于 2013-01-24T08:03:55.757 回答