混合类(Mixin classes)
有一个方式可以使代码重用而不需要严格的继承,如果你有一个期望在多个类中使用的函数,你能使它在多个类中共用。实际上,这和以下这种情况类似:你创建了一个包含多用途方法的类,然后用来扩充其他的类。这些包含多用途方法的类被称为混合类(Mixin Classes)。他们通常不直接调用或者实例化。他们的存在只是为了向其他的类传递方法。

MInxin Classes
1 var Minxin=function(){};
2
3 Minxin.prototype={
4
5 serialize: function(){
6
7 var output=[];
8
9 for ( key in this){
10
11 output.push(key +':'+ this[key]);
12
13 }
14
15 return output.join(',');
16
17 }
18
19 };
20
这个类有一个单一的方法(serialize),这个方法遍历This中的每个成员,然后把他们作为字符串输出。这种方法在不同类中有潜在的应用。但是使这些类都从Minxin继承是没有意义的。同样的,在每个类中添加这个类也是没有意义的。最好的解决方式就是使用augment函数在每个需要Minxin的类中添加此函数。

Use of augment to add method
1 augment(Author,Minxin);
2
3 var author= new Author('Ross Harms',['Pro javascript desigin Pattern']);
4
5 var serializedString=author.serialize();
6
在这里我们把Minxin所有的方法都添加到Author这个类中,实例化Author类就可以调用serilizez这个方法,这个是在javascript中实现多重继承的思路,C++可以让子类继承自多个父类。而javascript却无法实现这种继承,因为原型属性只能指向一个对象。但是一个类通过augment 函数可以增加多个Minxin类,这样就提供了同样的类似C++中的功能。
Augment非常的简单,使用for循环实现,迭代每一个给定类的原型中的成员。同时将他们添加到使用类的(比如Author类)原型中。如果某个成员已经存在,跳过它,这样就不会在使用类中的某个成员重载。

augment Function
1 function augment(receivingClass,givingClass){
2 for(methodName in givingClass.prototype){
3 if(! receivingClass.prototype[methodName]){
4 receivingClass.prototype[methodName]= givingClass.prototype[methodName];
5 }
6 }
7
8 }
我们稍微的改进该函数,比如你有一个Minxin类,此类包含了几个方法,但是你想给某个类传递这其中的某几个方法。函数上面的这个版本无法实现这个功能。新版本采用了参数化。如果方法存在,只有有名称的方法匹配这些参数。

Augment Function improved
1 /*Augment Function improved*/
2
3 function augment(receivingClass,givingClass){
4
5 if(arguments[2]){//only give certain methods
6
7 for(var i=2;i<arguments.length;i++){
8
9 receivingClass.prototype[arguments[i]]= givingClass.prototype[arguments[i]];
10
11 }
12
13 }else{//give all methods
14
15 for (methodName in givingClass.prototype){
16
17 if(! receivingClass.prototype[methodName]){
18
19 receivingClass.prototype[methodName]= givingClass.prototype[methodName];;
20
21 }
22
23 }
24
25 }
26
27 }
28
现在你能这样使用augment函数augment(Author,Minxin,’serialize’);这样就可以在Author类中添加单一方法serialize.你也可以以这种方式添加更多的方法。
通常来说向一个类中添加多个方法比从另外一个类中继承更有意义。这是一种轻量级的不增加复制代码的方法。不幸的事,这种方法的使用环境不怎么多。只有方法在不同类中的应用非常普通时,才考虑使用这种方法(如果类之间的差异程度不是很大那么使用普通的继承会是一个比较好的选择)。