代码改变世界

javascript习惯性的细节问题 —— 重谈细节,别只顾优雅

2013-04-17 18:28  MoltBoy  阅读(618)  评论(2编辑  收藏  举报

  晚饭之前,浏览了下博客园,阅读了梦想天空(山边小溪)翻译的《JavaScript初学者应注意的七个细节》的原文,写的非常不错。平常不注意的点点习惯,可能积累到最后成为致命的问题。正所谓,小病不医成大患,一定要防微杜渐。

  一、简化代码

  这是每个程序员最起码的素养和习惯,随着经验的不断丰富,一定学会回顾总结,写出简洁高效的代码。要想成为杰出的IT人员,忌讳只为完成任务而工作,除非你只是为了混口饭吃!至于如何简化代码,可以坚持阅读行业顶级人士的代码风格和习惯,当然不只是为了简洁代码而做这些工作,懂其然懂其所以然!

  具体如何简化,山边小溪已经列举了部分例子,另外可以灵活地使用“||”-逻辑或和“&&”-逻辑与,这里肯定有人反对,使用逻辑运算符时,一定程度上增加代码阅读难度,因而我使用了灵活运用字眼。当你有一定经验基础,使用逻辑运算符会让代码量降低,结构也非常清晰简单。至于哪些地方使用,什么时候使用,如何使用,这些都是经验的积累和总结!死记硬背得来的结果终究非你所得,好比是打肿脸充胖子!罗嗦一句,不要怕犯错,犯错是技术的永久财富!

  二、使用原生函数

  使用javascript自带的函数,或者寄主的原生函数,或者DOM方法等,都会让你完成工作更加轻松,但这并非万能膏药,任何时候任何地方都能使用!例如:博主在addclass函数中推荐使用Array.push()方法。

  在这里声明,只是就这个函数论事,无意横加指责,若有得罪还请见谅!

  个人感觉,为元素添加class name使用数组的push()颇为勉强,而且比起上面拼接字符串的方法更不易于理解。看看在firefox的测试数据:

  在chrome浏览器中测试,数据差别更大,况且这还是元素中没有class name的情况下!这样的情况,类似于面向对象中的拆箱和装箱动作,是比较消耗资源的,当然不是说Array.push()方法不好,而是不适合在这里使用,仅此而已!

  其他方面,文章写得很好,例如:事件委托,对象封装等。 推荐初学者仔细阅读,举一反三,点点滴滴的细节会改变代码的风格和质量!

  另外,关于设计模式方面,我就不多谈,因为自己涉入不深,自己犯错值得提倡,但不能误导别人!不过,我经常用到的对象封装模式,可以给大家看看,记住不存在万能的设计模式,挑选适合的,高效简洁的才是终极目标!

  如下是最为常见的惰性加载单体模式:

function Person(){
    var name, age, job, pay, uniqueInstance;   //私有属性
function prgetJob(){ //私有方法 return job; } function init(){ //初始化接口对象  
    var obj = { //接口对象
          getAttr: function(){ //获取私有属性
              return job + " " + pay;
          },
          getMethod: function(){ //获取私有方法
              prgetJob();
          },
          setAttr: function(n, a, j, p){ //设置私有属性
              name = n;
              age = a;
              job = j;
              pay = p;
          }
      };

  return obj;
  } 
  
return{
    getInstace: function(){
      if(!uniqueInstance)
        uniqueInstance = init();

      return uniqueInstance;
    }

  }; //返回接口方法

}
  var person = new Person();

  person.getInstace().setAttr("moltboy", 27, "it", "8000");

  console.log(person.getInstace().getAttr());

  单体模式有一个共同特点:单体对象都是在脚本加载的时候就被创建出来。对于资源密集型的或者开销甚大的单体,更合理的做法是将其实例化推迟到需要使用它的时候。这种技术叫做惰性加载(lazy loading),经常用于加载大量数据的单体。其他情形下,最好还是使用立即实例化方式。

  这种惰性加载单体的特别之处在于,对它们的访问必须借助于一个静态方法,如:Singleton.getInstance().methodName(),getInstance方法会检查该单体是否已经被实例化。如果没有,那么它将创建并返回其实例。如果已经实例化过,那么它将返回现有实例。