请问单体模式的方法里可不可以使用 this 访问同命名空间下的属性?

coglass 2013-08-05 11:10:58
看了《设计模式》P65关于命名空间的一段代码,我简化了一下:

$(function(){
var GiantCorp={};
GiantCorp.RegPage={
FORM_ID:'reg-form',
OUTPUT_ID:'reg-result',
init:function(){
GiantCorp.RegPage.fromEl=$("#"+GiantCorp.RegPage.FORM_ID)
GiantCorp.RegPage.fromEl.click(function(e){
alert(123);
});
}
}
GiantCorp.RegPage.init()
})


我觉得init方法里GiantCorp.RegPage可以用this代替,即:

$(function(){
var GiantCorp={};
GiantCorp.RegPage={
FORM_ID:'reg-form',
OUTPUT_ID:'reg-result',
init:function(){
this.fromEl=$("#"+this.FORM_ID)
this.fromEl.click(function(e){
alert(123);
})
}
}
GiantCorp.RegPage.init()
})


下面这种方法很简便,如果命名空间名字不叫GiantCorp,直接改就可以了,不用修改init,为什么设计模式一书不用,难道命名空间里的方法里不容许用this吗?
...全文
143 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
coglass 2013-08-07
  • 打赏
  • 举报
回复
嗯 多谢阿鱼
阿鱼 2013-08-06
  • 打赏
  • 举报
回复
如果像楼主的代码一样,立即执行init来生成GiantCorp.RegPage对象,是没区别的。 但是如果我们不立即生成,比如我们在某个事件发生时才生成:

//在click页面上的a元素时执行init
$('a').click(GiantCorp.RegPage.init);

//然后在控制台里打印一下GiantCorp.RegPage对象
console.log(GiantCorp.RegPage.init)

//结果:
//如果是按照第一种模式,那么GiantCorp.RegPage正常生成一个单例即:
//显示Object {FORM_ID: "reg-form", OUTPUT_ID: "reg-result", init: function, fromEl: b.fn.b.init[0]}

//如果是用含this的方式,那么GiantCorp.RegPage初始化失败(无法新增fromEl属性并给jquery对象
//添加click事件),因为这种情况init在执行的时候this已经变成了a元素。
//显示Object {FORM_ID: "reg-form", OUTPUT_ID: "reg-result", init: function}
====js里this无论在何时,都是要谨慎使用的====

87,991

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧