JavaScript,如何在使用单例时保持适当的封装
JavaScript, how to keep proper encapsulation in place while using a singleton?
我想开始更好地构建我的JavaScript,这样我就不会污染全局命名空间,并练习更好的封装和继承,正如我在本次代码审查中所描述的那样:https://codereview.stackexchange.com/q/64556/42628
所以,举个例子(这里是一个小提琴)。。。
window.myPage = {
init:function(){
//local "Private" declarations
var gridHandle1 = new myPage.MyGrid();
gridHandle1.loadGridData();
},
MyGrid: function(){
/* local "Private" declarations */
var dataLoadTimes = 0;
var gridDrawn = true;
$('#debug').append('grid is drawn<br>');
//This needs to be a public method because
//other functions need to reload the grid
//at various times. So I will use "this."
//instead of "var". "var" would make it a
//private method.
this.loadGridData = function() {
dataLoadTimes = dataLoadTimes+1;
$('#debug').append('grid data has been loaded '+dataLoadTimes+' times<br>');
};
this.loadGridData();
}
};
myPage.init();
// console.log(gridHandle1); // <--- fails, GOOD, it's not in the global namespace
// console.log(gridDrawn); // <--- fails, GOOD, it's not in the global namespace
我理解这里发生的一切,我喜欢它,因为"loadGridData"只属于"MyGrid",它没有任何意义,因为它自己的功能不属于"MyGrid",这会破坏封装。但这样做需要这条线。。。
var gridHandle1 = new myPage.MyGrid();
这很酷,它允许我创建许多这样的网格。。。
var gridHandle1 = new myPage.MyGrid();
var gridHandle2 = new myPage.MyGrid();
var gridHandle3 = new myPage.MyGrid();
但在这种情况下,我不需要太多网格。我只需要一个。所以我的问题是,我该如何调整这段代码,使所有东西都能正常工作,但作为一个单例执行,而不是使用"类"的方式,并使用构造函数实例化对象?
有几种方法可以实现这一点,并最终取决于偏好。
就我个人而言,我的代码是这样的:(没有jquery——我不使用它)
var myPage = {
ua: {}
}
$(function() {
myPage.mainLayout = new dhtmlXLayoutObject(document.body, "2U");
myPage.mainTabBar = myPage.mainLayout.cells("b").attachTabbar();
myPage.initTab(myPage.mainTabBar);
});
myPage.initTab=function(tb){
tb.xyz();
}:
myPage.ua.load=function(id){
myPage.ua.innerLayout = myPage.mainTabBar.tabs(id).attachLayout("1C");
myPage.ua.grid = myPage.ua.innerLayout.cells("a").attachGrid();
}
myPage.ua.search = function() {
myPage.ua.grid.clearAndLoad([theUrl], "json");
};
有时我定义ua
,有时我将所有内容都绑定到myPgae
。
相关文章:
- 单击时将焦点更改为元素
- HTML表单提交时未执行外部函数
- 使图像在单击时展开到不大于浏览器
- 使用jquery在单击时在单元格中输入值
- 阻止在select2单击时调用ajax
- 单击时切换两个图像
- JavaScript-在手机上不工作的情况下,在外部单击时隐藏元素
- 单击时显示,再次单击时隐藏
- 如何创建一个“;表单弹出框“;在chrome中右键单击时位于突出显示的单词上方
- 删除确认对话框在第一次单击时不起作用
- JavaScript:单击时相对于父级增加变量值
- Javascript onclick函数会立即调用(而不是在单击时调用)
- Javascript对象类在单击时打开窗口进行颜色选择,并在更改时替换对象背景颜色
- OpenLayers在悬停时高亮显示功能,并在单击时选择
- angularjs-控制器在表单提交时未调用
- JQuery在单击时停止显示/隐藏
- 在单击时过滤 JSON
- 使用Angular单击时更改特定图示符图标的颜色
- JavaScript,如何在使用单例时保持适当的封装
- 当注入到某个视图中时,注册的非单例实际上是一个单例