当一个项目的代码量比较多,或者多人开发的时候,就须要引入一些设计模式来让咱们更好的构建项目。不然代码就会变得乱糟糟,像一团面条同样了。
讲解设计模式比较好的书有:
一、设计模式
二、Head First设计模式编程
不过以上两本书主要是关于静态语言、面向对象的具体实现,由于静态面向对象语言(好比C++ 和 Java)代码写法限制的是比较多的。不能给类动态的添加属性、方法,函数的参数限制了类型等。设计模式
JS 虽然也是面向对象,可是同时支持函数式编程,函数自己是一种值能够传递。JS的动态特性也不会限制变量类型。
因此Java 中的多态对JS 来讲,那都不叫事。
对于 JS ,设计模式也应该更加灵活,不该该把静态语言的设计模式生搬硬套到 JS 上,而应该根据语言特性灵活应用。
关于 JS 的设计模式,强力推荐这本书:JavaScript设计模式与开发实践,来自腾讯的大牛所著。数组
讲解设计模式以前,咱们先接触一个重要的概念 鸭子类型
什么叫鸭子类型呢?函数式编程
需求:若是咱们想听鸭子的 嘎嘎嘎 叫声 状况:若是有一只狗(不是鸭子),它也能发出 嘎嘎嘎 的叫声。也就是说这条狗也能达到咱们的目的,那这条狗就是能够用的。 思考:咱们再也不管这个对象究竟是不是 instanceof Duck, 而是看它有没有 嘎嘎嘎 叫的能力。就是说咱们再也不是面向对象,而是面向接口。管它是什么类型,什么对象,只要实现了 嘎嘎嘎 叫的这个接口,能达到咱们的目的,就能够了。
举个例子:函数
// aDiv 不是数组,而是 HTMLCollection 对象 var aDiv = document.getElementsByTagName('div'); // 可是因为 aDiv 也有 length 属性,所以咱们能够像数组同样遍历它 for (var i=0, len=aDiv.length; i<len; i++) { console.log(aDiv[i]); }
接下来一个重要的概念是 封装
,把一个对象、方法或模块的内部实现隐藏起来,只暴露接口供外部使用。
JS 最多见的是用当即执行函数封装局部变量,局部函数,暴露出部分函数或变量。prototype
// 对 ming 这个对象进行了封装,privateName 只能在当即执行函数的内部使用,外部获取不到的。 var ming = (function() { // 乳名,外人不知道的 var privateName = '狗蛋'; // 学名 var publicName = '王小明'; var publicAge = 24; return { age: publicAge, getName: function() { return publicName; } }; }());
JS 面向对象采用的是原型克隆方式,而不是 Java 类和对象的模式。设计
所以 JS 生产对象的方式更像是 细胞分裂
,Object.prototype
做为第一个细胞,而后分裂出 Function.prototype 、Array.prototype 、String.prototype 等,分裂出来的细胞能够添加本身的属性和方法。并且 JS 是没有 类
这个东东的。code
Java 中的类像是一个模具,对象则是用这个模具印出来的,对象
第一篇文先说这么多,后续再把设计模式一一过一遍。最重要的是,推荐你们看看腾讯大牛的书。接口