模板模式:
模板模式是由2部分组成,第一部分是抽象父类,第二部分是子类实现,父类是对子类接口方法的定义和实现,而子类需实现父类定义的方法接口,也可以覆盖父类的方法实现。
js中并没有抽象类,那么抽象类是不可以被实例化的,可以这样检查:
1 2 3 4 5 6 7
| class Abstract { constructor() { if (new.target === Abstract) { throw new TypeError('不能实例化抽象父类'); } } }
|
同时如果子类没有实现该方法,但是我们可以再父类原型方法中抛错,如:
1 2 3
| Parent.prototype.mustBeExtend = function() { throw new Error('子类必须实现该方法'); }
|
模板顾名思义,是一个模板,即将子类中的共有的方法抽离出来生成一个父类,并让子类继承该模板父类。
如鸭子会叫,会吃,鸡也会叫,会吃,但是鸭子会游泳,鸡会飞,则会叫,会吃则可以抽离出来,而他们之间的不同则可以由子类自己实现,如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Animal { constructor() { if (new.target === Animal) { throw new TypeError('不能实例化抽象父类Animal'); } } eat() { console.log('eat'); } shout() { console.log('shout'); } specific(){ throw new Error('子类必须实现该方法'); } }
class Duck extends Animal{ specific(){ console.log('游泳'); } }
class Chicken extends Animal{ specific(){ console.log('会飞'); } }
|
在js中,其实很多时候我们选择的是高阶函数来代替模板模式。