js面向对象编程 的好处 一直不能理解求达人解惑
首先呢,我没学过任何面向对象的程序语言,
平时js 也用jq多,但是觉得 网站大了 功能多了,很多 函数 功能都大同小异,但是每次都要重写。
所以看书说 如果用面向对象的设计方式 去写函数 扩展性就强很多。不要用面向过程。
但是我一直不知道该如何转变。
比如说 今天接到一个需求,页面上有个倒计时。 需要计算 天数 小时 分钟 秒数
但是之前 又写过一个 分钟,秒数的,没有天数 小时的。结果今天这个又重写了。
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<p onclick="clearInterval(t1)"><span id="date"></span></p>
<script language=JavaScript>
function time(obj){
var endTime = obj.endTime;
var now = new Date();
var ms = Date.parse(endTime)-now.getTime();
function showTime(){
var s = ms /1000, min = s/60, h = min/60, d = h/24;
var text = parseInt(d,10)+'天'+addZero({time:parseInt(h%24,10)})+'小时'+ addZero({time:parseInt(min%60,10)})+'分'+ addZero({time:parseInt(s%60,10)})+'秒';
document.getElementById('date').innerHTML = text;
ms-=1000;
}
//个位数补0
function addZero(obj){
if(obj.time < 10){
obj.time = '0'+obj.time;
}
return obj.time;
}
return showTime;
}
var showtime = time({endTime:'3/18/2014 23:59:59'});
var t1 = setInterval("showtime()" ,1000);
</script>
</body>
</html>
但是我觉得 以后假如这个方法要去掉日期,只剩下小时,我改了又很麻烦,感觉分离没做好。
请问对我应该如何 改变思维 用面向对象的想法去设计这个方法。方便扩展 。
------解决方案--------------------试想一下,如果你要做一个选项卡的切换效果,页面上只有一个区域用到了选项卡,没什么问题,可视,当页面上到处都是选项卡的话,你该怎么处理? 往往你面临的情况没有想象中的简单,比如A div中的选项卡 实现自动切换 是正序,B div 的选项卡切换是倒序,如果你利用面向过程,那么改起来正的挺费劲
这个时候就需要把公共的部分抽象出来封装到一起,通过继承 多态的方法实现这样的需求
在面向对象中,你可能只需要传递一个 div id 外加一些控制参数,调用合适的方法来实现效果即可
你可以分三步走
1.将普通方法中的 公共变量 作为对象中的 this 下面的属性
2.将具体的功能函数 以 对象.protype.方法 的形式展示
3.修改方法中this的指向
------解决方案--------------------js里的面向对象不是用在这方面的。这种组件,要么你写个大而全的,通过参数设定显示什么内容。要么你写个小而精的,显示日期的跟不显示日期的分成两个东西。
如果你页面里有好几个倒计时的组件,每个组件都得有它自己的配置。这个时候就得面向对象了,显示倒计时的方法是核心的,页面里的组件都继承这个方法,而配置是各个组件独立的。
------解决方案--------------------同意5楼的说法。
你在设计一个方法的时候,就要决定这个方法以后可以复用到什么程度 。 给你一个例子参考 .
比如我这个项目我需要一个人民币换美元的方法 。
过程可能是这样的 :
1.去某个网页抓货币兑换率表
2.找出人民币换美元的兑换率
3.把原本的钱 乘或除兑换率 去新的钱
用3个方法完成这一项过程。
那么如果以后还要想要用这个方法的话 。我就得考虑哪些是可能改变的 。比如下一个项目可能不是人民币换美元 。
那么我就得把 人民币换美元写成一个变量通过参数来决定.
如果不同的对换必须要去不同的网页用不同的方式抓取 。
那么我们就得传更多的参数去做设置了 ,甚至把整个抓取的方法重写然后用参数去覆盖从前的方法.