JS 对象直接量方法创建对象

         以前在进行软件开发的时候,我一直都是用全局变量来进行函数之间的通信,因为当时学习并理解的方法也就这种方便快捷易懂,不过写多了之后发现,使用全局变量其实有比较多的坏处:

         在开发的初期阶段,一般是先搭建框架,实现最基本的功能,把全部功能函数写在一个文件里,要是需要在两个函数之间进行通信,就定义一个全局变量,在这个函数实现这个操作,在那个函数实现那个操作,诸如此类的。在代码量比较少,协同开发人员比较少的情况下,这样写是没什么问题,相反还比较方便,因为比较浅显。但如果功能要进行迭代开发呢?根据用户需求进行新功能的开发呢?原有模块要去掉呢?等等可能的情况。要是还使用全局变量的话,就是导致全局变量过多,令函数与函数之间的耦合度增加,在后期维护检测代码的时候需要不停梳理代码情况,增加维护成本。

         同时因为协同开发,每个人都有自己负责的模块,要是每个人都定义一些全局变量,你无法知道每一个人写出来的全局变量的作用,全局变量作用于哪些函数内,要是删除了,会造成什么影响,这些都是不可预料的后果,大大增加了后期开发的难度。

         综上所述,在开发中一般少用或不用全局变量。在C++或java等面向对象语言中,提供了类和对象的使用方法,我们可以通过对成员及方法进行封装来达到模块化的目的,同时可以通过对象与对象之间的通信来减低功能模块之间的耦合度。但是最近在进行JavaScript开发的时候,由于JS本身不提供类的封装等功能,属于弱语言,加上对JS的不熟悉,导致在开发中又走回了原点,使用全局变量来进行函数之间的通信,写着写着就发现不对了,不能这样写,于是开始思考JS的封装方式。

         最简单直接的方法就是创建对象,例程如下:

         var temp=

         {

                  time:undefined,                                   //对象成员

                   countTime:function(){}                       //对象方法

         }

注意:对象之间需要用逗号隔开;对象成员一定要用定义,要是不知道类型,可以用undefined来定义,总之一定要有值。

         现在我以一个计时函数作为例子来进行说明,首先,我定义的对象是这样的:

var CountTimeObject= {

   counter: 0,

   SecU: 0,

   SecD: 0,

   MinU: 0,

   MinD: 0,

   HourU: 0,

   HourD: 0,

   CleatTimeCount:,

   CountTime: function(){

       SecU = parseInt(((counter) % 60) % 10);

       SecD = parseInt((counter % 60) / 10);

       MinU = parseInt(((counter / 60) % 60) % 10);

       MinD = parseInt(((counter / 60) % 60) / 10);

       HourU = parseInt((counter / 3600) % 10);

       HourD = parseInt((counter / 3600) / 10);

       counter = counter+ 1;

       $('SecU').set('text',SecU);

       $('SecD').set('text',SecD);

       $('MinU').set('text',MinU);

       $('MinD').set('text',MinD);

       $('HourU').set('text',HourU);

       $('HourD').set('text',HourD);

       CleatTimeCount = setTimeout("CountTime()",1000);

   },

   CountTimePlus: function() {

       clearTimeout(CleatTimeCount);

       counter = 0;

       SecU = 0;

       SecD = 0;

       MinU = 0;

       MinD = 0;

       HourU = 0;

       HourD = 0;

       CountTime();

   }

};

在第一次调试的时候怎么都不成功,检查过后才发现所有对象都要赋值才行,因为我想着一开始不给值的,等使用的时候再初始化,结果发现不行。

后来做了修改,如下:

CleatTimeCount:undefined,   //加上定义

这次是在使用中出现问题,提示使用的变量没有被定义,最后查询的结果是没有表明使用的变量的作用对象,再次修改如下:

var CountTimeObject= {

   counter: 0,

   SecU: 0,

   SecD: 0,

   MinU: 0,

   MinD: 0,

   HourU: 0,

   HourD: 0,

   CleatTimeCount: undefined,

   CountTime: function(){

       this.SecU=parseInt(((this.counter) % 60) % 10);

       this.SecD=parseInt((this.counter % 60) / 10);

       this.MinU=parseInt(((this.counter / 60) % 60) % 10);

       this.MinD=parseInt(((this.counter / 60) % 60) / 10);

       this.HourU=parseInt((this.counter / 3600) % 10);

       this.HourD=parseInt((this.counter / 3600) / 10);

 

       this.counter= this.counter+ 1;

       $('SecU').set('text',this.SecU);

       $('SecD').set('text',this.SecD);

       $('MinU').set('text',this.MinU);

       $('MinD').set('text',this.MinD);

       $('HourU').set('text',this.HourU);

       $('HourD').set('text',this.HourD);

 

       This.CleatTimeCount=setTimeout("this.CountTime()",1000);

   },

   CountTimePlus: function() {

       clearTimeout(this.CleatTimeCount);

       this.counter= 0;

       this.SecU= 0;

       this.SecD= 0;

       this.MinU= 0;

       this.MinD= 0;

       this.HourU= 0;

       this.HourD= 0;

       this.CountTime();

   }

};

这次还是出现了问题,计时器代码只运行了一次就停了,后面是乱码,这里耗费了我大量的时间去查阅资料,最后得到一个结果,在setTimeout()函数里,用this引用当前对象的成员函数会导致成员查找失败,应该使用对象名引用对象成员方法,最终版本代码如下:

var CountTimeObject = {

   counter: 0,

   SecU: 0,

   SecD: 0,

   MinU: 0,

   MinD: 0,

   HourU: 0,

   HourD: 0,

   CleatTimeCount: undefined,

   CountTime: function(){

       CountTimeObject.SecU =parseInt(((CountTimeObject.counter)% 60) % 10);

       CountTimeObject.SecD =parseInt((CountTimeObject.counter% 60) / 10);

       CountTimeObject.MinU =parseInt(((CountTimeObject.counter/ 60) % 60) % 10);

       CountTimeObject.MinD =parseInt(((CountTimeObject.counter/ 60) % 60) / 10);

       CountTimeObject.HourU =parseInt((CountTimeObject.counter/ 3600) % 10);

       CountTimeObject.HourD =parseInt((CountTimeObject.counter/ 3600) / 10);

 

       CountTimeObject.counter =CountTimeObject.counter + 1;

       $('SecU').set('text',CountTimeObject.SecU);

       $('SecD').set('text',CountTimeObject.SecD);

       $('MinU').set('text',CountTimeObject.MinU);

       $('MinD').set('text',CountTimeObject.MinD);

       $('HourU').set('text',CountTimeObject.HourU);

       $('HourD').set('text',CountTimeObject.HourD);

       CountTimeObject.CleatTimeCount =setTimeout("CountTimeObject.CountTime()", 1000);

   },

   CountTimePlus: function() {

       clearTimeout(CountTimeObject.CleatTimeCount);

       CountTimeObject.counter = 0;

       CountTimeObject.SecU = 0;

       CountTimeObject.SecD = 0;

       CountTimeObject.MinU = 0;

       CountTimeObject.MinD = 0;

       CountTimeObject.HourU = 0;

       CountTimeObject.HourD = 0;

       CountTimeObject.CountTime();

   }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值