把面向过程的JS代码改写成面向对象的JS代码,总的遵循原则是:
不能有函数嵌套,可以用全局变量来避免。
onload 里面写构造函数。
全局变量相当于属性
函数相当于对象的方法
面向对象的代码特别要注意的是this,这可是非常容易搞错。它所指向的并不是一定就是那个对象,有可能是它的属性!这一点主要在匿名函数里会有区别。
先来看一下面向过程的代码:
window.onload=function(){
var inpu=document.getElementsByTagName('input');
var div=document.getElementById('div1')
var odiv=div.getElementsByTagName('div')
for(var i=0;i
inpu[i].onmou
ver=function(){
this.className='active';
odiv[this.index].style.display='block'
}
inpu[i].onmouseout=function(){
this.className='';
odiv[this.index].style.display='none'
}
}
}
把它改成相应的面向对象的JS代码形式如下:
window.onload=function(){
new construct('div1')
}
function construct(id){
var div=document.getElementById(id)
this.inpu=document.getElementsByTagName('input')
this.odiv=div.getElementsByTagName('div');
var _this=this;
for(var i=0;i
this.inpu[i].onmouseover=function(){
this.className='active';
_this.odiv[this.index].style.display='block'
}
this.inpu[i].onmouseout=function(){
this.className='';
_this.odiv[this.index].style.display='none'
}
}
}
看到上面两种代码形式的区别了吗?一般来说只有大型网站采用面向对象形式编写,个人网站都不需要这种方式,虽然js采用面向对象编写时越来越流行了,但流行的东西不一定对每一个人都是好的。
下面再来看一种更简洁的方式:JSON形式的面向对象代码形式:还是上面的例子,改写成json形式如下:
window.onload=function(){
json.exec()
}
var json={
index:1,
div:function(){
return document.getElementById('div1')
},
inpu:function(){
return document.getElementsByTagName('input')
},
odiv:function(){
return this.div().getElementsByTagName('div');
},
exec:function(){
for(var i=0;i
this.inpu()[i].onmouseover=function(){
this.className='active';
json.odiv()[this.index].style.display='block'
}
this.inpu()[i].onmouseout=function(){
this.className='';
json.odiv()[this.index].style.display='none'
}
}
}
}