Mixin模式
在C++和Lisp等传统编程语言中,Mixin是可以轻松被一个子类或一组子类继承功能的类,目的是函数复用。
子类化
子类化
这个术语是指针对一个新对象,从一个基础或超类对象中继承相关的属性。在传统的面向对象编程中,类B是从另外一个类A扩展得来。这里我们认为A是一个超类,B是A的一个子类。因此,B的所有实例从A处继承了相关方法。但是B仍然能够定义自己的方法,包括那些A最初定义方法的重写。
A中的一个方法,在B中已经被重写了,那么B还需要调用A中的这个方法吗,我们称此为方法链。B需要调用构造函数A吗,我们称此为构造函数链。
1 | var Person = function(firstName, lastName) { |
Mixin(混入)
在Javascript中,我们可以将继承Mixin看作为一种通过扩展收集功能的方式。我们定义的每个新对象都有一个原型,可以从中继承更多属性。原型可以继承于其他对象的原型,但更重要的是,它可以为任意数量的对象实例定义属性。可以利用者一点来促进函数复用。
我们在标准对象字面量中定义一个包含实用函数的Mixin
1 | var myMixins = { |
正如我们所看到的,这允许我们以通用的方式轻松“混入”对象构造函数
在下一个示例中,我们有两个构造函数:Car和Mixin。我们要做的是扩充(扩展的另一种说法)Car,以便它可以继承Mixin中定义的特定方法,即driveForward()和driveBackward()。这次我们不会实用underscore.js
1 | var Car = function(settings) { |
优点和缺点
Mixin有助于减少系统种的重复功能及增加函数复用。当一个应用程序可能需要在各种对象实例中共享行为时,我们可以通过在Mixin中维持这种共享功能并专注于仅实现系统中真正不同的功能,来轻松避免任何重复。
有些开发人员认为将功能注入对象原型是一种很糟糕的想法,因为它会导致原型污染和函数起源方面的不确定性。在大型系统中,可能就会有这种情况。