JavaScript-设计模式
原型模式
原型模式就是将原型对象指向创建对象的类,使这些类共享原型对象的方法和属性。JavaScript 是基于原型链实现对象之间的继承,这种继承是基于一种对象属性或者方法的共享,而不是对属性和方法的复制。
创建一个焦点图
页面中的焦点图其切换的动画是多样化的,可能上下,左右,渐隐等。
1 | // 图片轮播图类 |
基类 LoopImages 是要被子类继承的,此时每次子类继承都要创建一次父类,假如父类的构造函数中创建时存在很多消耗很大的逻辑,或者每次初始化都做一些重复的东西,这样就对性能消耗很大。
最优的解决方案
创建基类时,对于每次创建的一些简单而又差异化的属性放在构造函数中,将一些消耗资源较大的方法放到基类的原型中,这样可以避免很多不必要的消耗。
1 | // 图片轮播类 |
原型的拓展
原型对象是一个共享对象,继承时对它的一个指向引用,所以,对原型拓展,不论是子类还是父类的实例对象都会继承下来。
1 | // 父类拓展 |
不要随意修改基类原型,因为这会影响到其他继承基类的方法。
原型继承
原型模式更多的是用在对对象的创建上。比如创建一个实例对象的构造函数比较复杂,或者耗时比较长,或者通过创建多个对象来实现。此时最好不要用 new 关键字去复制这些类,但可以通过对这些对象或者方法进行复制来实现创建。首先要有一个原型模式的对象复制方法。
1 | /**** |
比如企鹅游戏中我们创建一个企鹅对象,如果游戏中没有企鹅基类,只提供一些动作模版对象,我们就可以通过实现对这些模版对象的继承来创建一个企鹅实例对象。
1 | var penguin = prototypeExtend({ |
既然通过 prototypeExtend 创建的是一个对象,我们就无需再用 new 去创建新的实例对象,我们可以直接使用这个对象。
1 | penguin.swim(); // 游泳速度 20 |
小结
原型模式可以让多个对象分享同一个原型对象的属性和方法,这也是一种继承法法,不过这种继承的实现是不需要创建的,而是将原型对象分享给那些继承的对象。当然有时需要让每个继承对象独立拥有一份原型对象,此时我们就需要对原型对象进行复制。
由此可以看出,原型对象更合适在创建复杂对象时,对于那些需求一直在变化而导致对象结构不停地改变时,将那些比较稳定的属性与方法共用而提取的继承实现。
以上笔记出自《JavaScript设计模式(张容铭)》