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方法会检查该单体是否已经被实例化。如果没有,那么它将创建并返回其实例。如果已经实例化过,那么它将返回现有实例。