上一章回顾了JS对象的属性类型,那么除了咱们经常使用的new Object()
构造函数建立对象和字面量方式建立对象的方式外,还须要用到更多的模式来解决对象被屡次复用的问题。什么意思呢?就是咱们颇有可能会在各个地方去使用已经建立过的对象,可是对象里的属性值有多是不一样的。举个例子:设计模式
let obj = { name:"勾鑫宇", age:18, myName:function(){ console.log(this.name) } }
若是咱们想继续使用这个obj对象,但里面的属性值须要改变,咱们可能会想到这样作:函数
let obj2 = obj; obj2.name = "张三";
可是这样作有一个问题,因为JS中引用类型的机制,当你修改obj2
的同时,obj
也被改变了。因此咱们就不得不像下面这样再从新建立一个obj2
对象。网站
let obj2 = { name:"张三", age:23, myName:function(){ console.log(this.name) } }
这样就无形中给咱们增长了不少工做,代码量也会大大增长,而这么多重复的东西是彻底不必的。因而咱们就须要用到建立对象的各类设计模式来解决这个问题了,这章先讲工厂模式。this
根据书上和各类百科的解释,仍是先来一个官方版本,而后写写个人理解吧。设计
官方解释:
工厂是构造方法的抽象,抽象了建立具体对象的过程。工厂方法模式的实质是“定义一个建立对象的接口,但让实现这个接口的类来决定实例化哪一个类。工厂方法让类的实例化推迟到子类中进行。code
工厂模式分为三类:简单工厂模式、工厂方法模式和抽象工厂模式对象
个人理解:
至于为何要叫工厂模式,就是由于这个模式将咱们所须要的逻辑代码给封装到了一个函数里面,而后咱们只须要传入相应的参数,就可以去获取须要的结果。这个过程就如同咱们向工厂要东西同样简单。好比咱们须要一台电脑,只须要告诉工厂电脑的屏幕尺寸是多大、系统是Win仍是Linux、内存是多少G,而不用关心屏幕是怎么制做的,系统是怎么设置的,内存条是怎么作的,最重要的是最终这个电脑是怎么组装出来的咱们也不关心,只关心最后能拿到一台咱们所需的成品电脑就好了。接口
因为《JS高编》里这一部分只讲了简单工厂模式的实现,其余两种模式就先不说,更多的能够去看《JS设计模式》。内存
//建立一个简单函数,就看成一个类 //第一种方式是经过new Object()建立对象,最后返回它 function person(name,age){ let o = new Object(); o.name = name; o.age = age; o.myName = function(){ console.log("个人名字是"+o.name) } return o; } let person1 = person("勾鑫宇",18); let person2 = person("张三",23); person1.myName();//输出“个人名字是勾鑫宇” person2.age;//输出23 //第二种方式是经过字面量形式建立对象 function person(name,age){ let o = { name: name; age: age; myName: function(){ console.log("个人名字是"+o.name) } } return o; }
上面的方法使用简单工厂模式封装了一个类,而后咱们只须要传入名字和年龄的参数就好了。那么咱们还能够添加稍微复杂一点的逻辑在这个工厂里面。产品
function person(name,age,country){ let o = { name: name, age:age, myName:function(){ console.log("个人名字是" + o.name) }, country:country, type:'' } if(age > 18 && country !== 'China'){ o.type = "成年人"; console.log('容许进入该网站') } else if(age < 18 ){ o.type = "未成年"; console.log('不容许进入该网站') } else { o.type = "成年人"; console.log('不容许进入该网站') } return o } let person1 = person("李四",20,"Japan");//输出“容许进入该网站” let person2 = person("张三",17,"Japan");//输出“不容许进入该网站” let person3 = person("王五",23,"China");//输出“不容许进入该网站”
简单工厂模式的优势很明显,就是将咱们的逻辑代码都封装好了,最终只暴露出一个公共的接口让咱们传入参数便可使用。这种方式极大地减小了代码量,提升了代码的复用性。同时使得咱们可以根据不一样的条件去创造不一样的工厂,最终得到不一样的产品。
这种模式的缺点也是很明显的,由于咱们复杂的逻辑都封装在了函数里,一旦某处出现了逻辑错误,就会影响全部使用这个工厂的人,能够说是牵一发而动全身。