我正在尝试使用公共方法和公共变量创建一个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 :(得分: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;
};
答案 1 :(得分: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);
};
如果你想让你的字段保密,那么你必须添加更改它们的功能,但在你的情况下会更重。
答案 2 :(得分:0)
如果要立即调用函数并将返回的对象分配给()
,则需要在函数声明的末尾添加jeeni.DataGrid
。例如,
var obj = (function (someArg1) {
return { pubVar1 : someArg1 };
}("Hello World"));
//Alerts "Hello World".
alert(obj.pubVar1);
要测试函数/变量的返回值,您始终可以使用console.log(obj)
并检查浏览器调试控制台上的输出(如果您使用的是Chrome F12,通常会显示此控制台)。
希望这有帮助!