javascript设计模式和开发实践(阶段一)
1,设计模式的作用:让人们写出可复用和可维护性高的程序,代价可能是,额外增加代码量;
比较形象的例子:空房间里面放东西,如果日复一日的往里面扔东西,时间久了,很难找到自己想要的东西,调整也不容易,但是做一些柜子放东西,虽然前期增加了成本,但是在维护阶段带来了极大的好处。【柜子存放东西】,或许就是一种模式。
2,所有设计模式的实现遵循一条原则:找出程序中变化的地方,并将变化封装起来。程序中不变和稳定的部分是很容易复用,所以需要封装变化的部分。
初学者针对设计模式很容易出现“锤子理论”:当我们有一把锤子,看什么都是钉子。意思是:设计模式的深刻意图,只有结合实际项目场景灵活使用。
3,编程语言分类:静态类型,动态类型。
静态类型语言:在编译时候便已经确定变量的类型。动态类型语言:变量被赋值后,才具有某种类型。
静态语言和动态语言的优缺点:静态语言明确规定了数据类型,迫使程序员按照契约来写程序,辅助程序员编写可靠性高的代码,动态语言优点是编写代码量减少,更加简洁,但是无法保证变量类型,可能在运行过程中发生跟类型相关的错误。Javascript是一门典型的动态类型语言,动态类型语言对变量类型带来了很大的宽容性。
“鸭子类型”:如果它走起路来像鸭子,叫起来也是鸭子,那么它就是鸭子。通俗易懂的来讲:我们关注的是对象的行为,不关注对象本身。
(我觉着这本书写的好棒,下面还有个鸭子的故事程序)
var duck = { duckSinging(){ console.log('嘎嘎嘎') } } var chicken = { duckSinging(){ console.log('嘎嘎嘎') } } var choir = []; //合唱团 var joinChoir = function(animal){ if(animal && typeof animal.duckSinging === 'function'){ choir.push(animal); console.log('恭喜加入合唱团'); console.log('合唱团已有成员数量:'+choir.length) } } joinChoir(duck); //恭喜加入合唱团 //合唱团已有成员数量:1 joinChoir(chicken); //恭喜加入合唱团 //合唱团已有成员数量:2
对于加入合唱团的动物,无论小狗,小鸡,小猫,只要拥有duckSinging的方法,就能够加入进来。在动态类型语言的面向对象方法中,“鸭子类型”概念至关重要。
利用“鸭子类型”思想,“面向接口编程,而不是面向实现编程”。面向接口编程,意思就是不是很关注实现,只关注接口API的输出,对象内部的变化对其他对象而言是透明的,也就是不可见的,透明的意思是:你不知道它是如何做到的,反正它就是能做到。
var makeSound = function(animal){ if(animal instanceof Duck){ console.log('嘎嘎嘎') }else if(animal instanceof Chiken){ console.log('咯咯咯') } } var Duck = function(){}; var Chiken = function(){}; makeSound(new Duck()); //嘎嘎嘎 makeSound(new Chiken()) //咯咯咯
上面的代码体现了“多态”,将“做什么”和“怎么做”分开,就是当我们对调用一些函数时,函数会返回不同的执行结果,这就是多态性的一种体现。