最近在做javascript开发的时候,经常会发现如下的设计模式:
var handler = {};
handler.ff = {
init:function(){
alert(11);
},ee:function(){
alert(22);
}
}
handler.ff.init.ff = handler.ff;handler.ff.init.ff.init();//结构:11
handler.ff.init.ff.init.ff.init();//结构:11
handler.ff.init.ff.init.ff.init.ff.init();//结构:11
handler.ff.init.ff.init.ff.init.ff.init.ff.init();//结构:11
handler.ff.init.ff.init.ff.init.ff.init.ff.init.ff.init();//结构:11
......
在firebug下查看handler对象,你会发现这个对象是无限递归的!
这种模式好令人困惑,特别是经过这次赋值(handler.ff.init.ff = handler.ff;),里面的init就是无限递归的,
希望大家能帮忙探讨下,谢谢!
var handler = {};
handler.ff = {
init:function(){
alert(11);
},ee:function(){
alert(22);
}
}
handler.ff.init.ff = handler.ff;handler.ff.init.ff.init();//结构:11
handler.ff.init.ff.init.ff.init();//结构:11
handler.ff.init.ff.init.ff.init.ff.init();//结构:11
handler.ff.init.ff.init.ff.init.ff.init.ff.init();//结构:11
handler.ff.init.ff.init.ff.init.ff.init.ff.init.ff.init();//结构:11
......
在firebug下查看handler对象,你会发现这个对象是无限递归的!
这种模式好令人困惑,特别是经过这次赋值(handler.ff.init.ff = handler.ff;),里面的init就是无限递归的,
希望大家能帮忙探讨下,谢谢!
解决方案 »
- 怎么让右边的背景切换时,左边的标题就对应右边
- 怎么根据cookie显示内容?
- 如何动态创建一个JAVASCRIPT FUNCTION ?
- JS如何从控件(ASPxPageControl)中取TextBox中的值?
- HTML中有三个输入框怎样按一下回车键,就使光标从第一个跳到最后一个输入框??
- select option控件如何按ID号排序问题
- 请教传递数据 谢谢
- javascript打印设置问题。。。
- JS:confirm中的内容如果是直接定义的字符串可以换行,如果是从input中取得的不能换行?
- 数据的导入、导出问题!
- 用火狐跳转表单时出现tag is null
- 请教:jquery阻止事件冒泡不成功!
handler.ff.init.ff = handler.ff; handler.ff.init.ff就具有了handler.ff的地址,可以访问handler.ff下面的层级,于是又找到handler.ff.init.ff,而它的值还是handler.ff的地址,再找……只有在比较特殊的时候,发挥利用这个特点能有些特别的好处。
楼主可以把你近来常见的这种应用(定义后怎么用的)发来一起讨论一下。
http://www.nowamagic.net/jquery/jquery_AutoCompletePlugin.php里面的$.fn.autoComplete插件
都是采用这样的模式来设计的。
它们的模式都是这样做的
var handler = {};
handler.prototype = {
init:function(){
alert(11);
},ee:function(){
alert(22);
}
}
handler.prototype.init.prototype = handler.prototype;
javascript的原型继承用到prototype这个关键字,但是prototype是构造函数才有的属性,这里的handler明显是实例对象,因此handler是没有prototype属性的。所以我将上面的一段代码改成:
var handler = {};
handler.ff = {
init:function(){
alert(11);
},ee:function(){
alert(22);
}
}
handler.ff.init.ff = handler.ff;
结果显示能正常运行,没有报错,这就证明了这里的prototype是误导人的。
我明白这个模式的好处就是能够很好的实现继承,但我不明白为什么可以这样写,这里的handler对象为什么是无限递归的!这里用到了javascript的什么原理呢?附图:
产品类别类中有产品类的集合,产品类中有产品类别的引用。这样就构成循环引用,当转化为JSON时,就会发生种循环引用问题!
$.fn.defaults={},这样的形式,随时改变初始值!这种内部大量使用该形式的方法有很大优点,可以方便插件的改写,即使对其内部分结构不能马上看清楚,也能很方便外部改写扩展,而且不会打乱原插件!方便写插件的插件!如果换成纯JS就有点类似楼主说的这种设计模式的说法了。