js设计模式
2018-03-11 00:19
197 查看
js设计模式-持续更新
一些设计点
用对象来收编变量(包括函数)。这里的“对象”可以是函数。为了让每一个对象有『自己的』方法,可以对类的prototype属性来进行定义。
链式使用可以通过在方法中返回this即这个对象本身来实现。
为函数的“祖先”Function添加函数,可以用下面的形式:
Function.prototype.addMethod = function(name, fn){ this[name] = fn; // return this; 加上一条return,使得这个方法可以被链式调用(链式添加-注意不是链式调用哦),eg. var method = function(){}; method.addMethod('checkName',function(){ }).addMethod('checkEmail',function(){ }); }为什么不直接在Function.prototype上添加函数呢?答案也是很明显的————别人如果也创建了函数,会被你写的这个函数所污染。
当然,如果习惯使用类的方式,可以将上面的this[name] = fn更改为this.prototype[name] = fn。这种方式在使用时就需要new一个对象来调用方法。
在使用面向对象编程的时候,为了防止忘记写运算符new而造成的错误,应该使用创建对象的安全模式:即在类中判断:this instanceof Book是否为true,如果是的话可以直接构造;如果不是的话return new,用new重新调用。
继承
类式继承(通过原型链继承)SubClass.prototype = new SuperClass()缺点:由于跟prototype有关,父类中定义的一些属性会变成公交车。
构造函数继承在子类SubClass中调用:SuperClass.call(this)。即执行父类的构造方法。
组合继承结合以上两种 但是这样做的话,父类中的构造函数在使用构造函数继承和实现子类原型继承时都被调用,在父类构造函数属性多并复杂的情况下就不值得了。
寄生式直接对一个函数中的过渡对象进行prototype赋值来实现原型继承,并返回新对象
寄生组合式继承寄生式继承结合构造函数继承。在子类构造函数中调用父类构造函数,而原型继承采用寄生的方式(直接针对父类的prototype对象)
⚠️:这里我们需要将得到的中间对象的constructor设置为它本身。
多继承 可以通过拷贝方法与属性的方式实现。
多态 通过对传递的参数判断决定执行逻辑。
创建型设计模式(处理对象创建的设计模式)
简单工厂模式创建单一对象使用一个函数,通过传入参数决定创建的对象并返回该对象。这个叫做工厂。
工厂方法模式如果要创建很多类的对象,那么简单工厂模式就不再适用了,需要使用工厂方法模式。(当然要是安全的工厂方法)
调用工厂函数时,实际上返回的是通过保存在工厂类prototype里面的各种类的对象。
抽象工厂模式 - “幽灵