什么是设计模式
作者的这个说明解释得挺好
假设有一个空房间,我们要日复一日地往里 面放一些东西。最简单的办法当然是把这些东西 直接扔进去,但是时间久了,就会发现很难从这
个房子里找到自己想要的东西,要调整某几样东 西的位置也不容易。所以在房间里做一些柜子也 许是个更好的选择,虽然柜子会增加我们的成
本,但它可以在维护阶段为我们带来好处。使用 这些柜子存放东西的规则,或许就是一种模式
- 一提起设计模式,相信大家都会脱口而出,23种设计模式,五大设计原则。
创建型模式
工厂模式
工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象,用工厂方法代替new操作的一种模式。
class Creator {
create(name) {
return new Animal(name)
}
}
class Animal {
constructor(name) {
this.name = name
}
}
var creator = new Creator()
var duck = creator.create('Duck')
console.log(duck.name) // Duck
var chicken = creator.create('Chicken')
console.log(chicken.name) // Chicken
小结
构造函数和创建者分离,对new操作进行封装
符合开放封闭原则
优点:只要我们往工厂函数里面塞参数,工厂函数就会像生产产品一样造个人出来。
缺点:这种方式本质上是将创建对象的过程进行了封装,本质并没有改变,我们创建一个student时无法知道其具体的数据类型,只知道这是一个对象,往往实际开发中我们需要确定这个对象到底是个Person的实例还是Dog的实例。
原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。–百度百科
在JavaScript中,实现原型模式是在ECMAScript5中,提出的Object.create方法,使用现有的对象来提供新创建的对象的__proto__。
var prototype = {
name: 'Jack',
getName: function() {
return this.name
}
}
var obj = Object.create(prototype, {
job: {
value: 'IT'
}
})
console.log(obj.getName()) // Jack
console.log(obj.job) // IT
console.log(obj.__proto__ === prototype) //true
- 方法继承
var Parent = function() {}
Parent.prototype.show = function() {}
var Child = function() {}
// Child继承Parent的所有原型方法
Child.prototype = new Parent()
- 所有函数默认继承Object
var Foo = function() {}
console.log(Foo.prototype.__proto__ === Object.prototype) // true
- Object.create
var proto = {a: 1}
var propertiesObject = {
b: {
value: 2
}
}
var obj = Object.create(proto, propertiesObject)
console.log(obj.__proto__ === proto) // true
- isPrototypeOf
prototypeObj是否在obj的原型链上
prototypeObj.isPrototypeOf(obj)
- instanceof
contructor.prototype是否出现在obj的原型链上
obj instanceof contructor
- getPrototypeOf
Object.getPrototypeOf(obj) 方法返回指定对象obj的原型(内部[[Prototype]]属性的值)
Object.getPrototypeOf(obj)
- setPrototypeOf
设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或 null
var obj = {}
var prototypeObj = {}
Object.setPrototypeOf(obj, prototypeObj)
console.log(obj.__proto__ === prototypeObj) // true
优点:简化对象的创建,使得创建对象很简单,原型模式对客户隐藏了具体的产品类。
缺点:每一个抽象原型Prototype的子类都必须实现clone操作,实现clone函数可能会很困难。