var menu=new menu.dd("menu");
var menu=function(){
function dd(n){this.n=n;alert(this.n)}
return {dd:dd}
}
一个国外牛人写的一个导航截取了不懂的地方,那位牛人帮忙解释一下我的疑问
1.var menu=new menu.dd("menu"); 这种方式初始化的对象指什么 dd?
2.return{dd:dd} 这个地方没理解
就上面的两个问题,明白的牛人希望不惜赐教!
var menu=function(){
function dd(n){this.n=n;alert(this.n)}
return {dd:dd}
}
一个国外牛人写的一个导航截取了不懂的地方,那位牛人帮忙解释一下我的疑问
1.var menu=new menu.dd("menu"); 这种方式初始化的对象指什么 dd?
2.return{dd:dd} 这个地方没理解
就上面的两个问题,明白的牛人希望不惜赐教!
var cls = menu.dd;
var menu=new cls("menu");var menu=function(){
return {dd:function(n){this.n=n;alert(this.n)}}
}
menu().dd(111);
var menu=new menu.dd("menu");
var menu=function(){
function dd(n){this.n=n;alert(this.n)}
return {dd:dd}
}
1.var menu=new menu.dd("menu"); 这种方式初始化的对象指什么 dd?
==>menu["menu"] = "menu;"
2.return{dd:dd} 这个地方没理解
返回了一个对象 就是
var menu=function(){
function dd(n){this.n=n;alert(this.n)}
return {dd:dd}
}
等价于
menu = {dd:dd};
蓝色理想上以为朋友把2看做闭包。
雷同 cj205 版主。
但是
var menu=function(){
function dd(n){this.n=n;alert(this.n)}
return {dd:dd}
}
alert(menu)是function(){
function dd(n){this.n=n;alert(this.n)}
return {dd:dd}
} 而非是{dd:dd};
如果按照闭包理解,则至少需要两个()即
var menu=(function(){
function dd(n){this.n=n;alert(this.n)}
return {dd:dd}
})();
var t=15,z=50,s=6,a;
function dd(n){this.n=n; this.h=[]; this.c=[]; alert(this.n)}
dd.prototype.init=function(p,c){
a=c; var w=document.getElementById(p)/* 获取整个菜单根节点*/, s=w.getElementsByTagName('ul')/*获取二级栏目集合*/, l=s.length,/*二级栏目的个数*/ i=0;
for(i;i<l;i++){//遍历 ul 即所有一级栏目
var h=s[i].parentNode; /*获取当前栏目的根节点li*/this.h[i]=h;/*获取当前栏目标题*/ this.c[i]=s[i];//获取当前栏目的子栏目
//给一级栏目绑定事件
h.onmouseover=new Function(this.n+'.st('+i+',true)');//传入的两个参数一个是当前的ul索引值 一个是布尔值
h.onmouseout=new Function(this.n+'.st('+i+')');
}
}
dd.prototype.st=function(x,f){//为继承对象的属性所以采用了这种 绑定方式
var c=this.c[x]/*当前的一级栏目的2级栏目*/, h=this.h[x]/*当前一级栏目*/, p=h.getElementsByTagName('a')[0];//获取当前一级栏目a标签
clearInterval(c.t); c.style.overflow='hidden'; /*当显示内容超过了限定高度多余的部分隐藏*/
if(f){
//alert(p.className);
p.className+=' '+a;//获取一级栏目className p.className = menulink menuhover
//alert(p.className);
if(!c.mh){c.style.display='block';/*当鼠标移动到一级栏目上是是否显示其子栏目 */ c.style.height=''; c.mh=c.offsetHeight;/* 获取二级菜单展开高度*/c.style.height=0}
if(c.mh==c.offsetHeight){c.style.overflow='visible'}
else{c.style.zIndex=z; z++; c.t=setInterval(function(){sl(c,1)},t)}//用对象的一个属性作为 setInterval()的返回值
}else{p.className=p.className.replace(a,'');/*replace()方法用于替换字符串 第一个参数是旧值 第二个参数是新值*/
c.t=setInterval(function(){sl(c,-1)},t)}
}
function sl(c,f){
var h=c.offsetHeight;
if((h<=0&&f!=1)||(h>=c.mh&&f==1)){
if(f==1){c.style.filter=''; c.style.opacity=1; c.style.overflow='visible'}
clearInterval(c.t); return
}
var d=(f==1)?Math.ceil((c.mh-h)/s):Math.ceil(h/s), o=h/c.mh;
c.style.opacity=o; c.style.filter='alpha(opacity='+(o*100)+')';
c.style.height=h+(d*f)+'px'
}
return{dd:dd}
}();
菜鸟偶看不懂了.
看下上面这个吧var menu=function(){
function dd(n){this.n=n;alert(this.n)}
return {dd:dd}
}();这个是实质上是自执行函数返回了一个对象,即return的部分,var menu=new menu.dd("menu");
menu.dd("menu")这个应是实例一个对象.调用的 menu对象的dd方法。函数体即dd.但这里用new不知为何意?
demo地址~
http://www.leigeber.com/2008/05/sliding-javascript-menu-highlight-1kb/