之前写过了类和原型,这里再说聚合,在写关于聚合之前,对与继承我再总结一下。JavaScript中关于继承的方式一共有三种,之前写了两种,但是没有说明,这里补充说明一下。
1.类式继承:通过在函数对象内调用父类的构造函数,使自身获得父类的属性和方法。主要使用call和apply回调
1 var Person = function(){ 2 this.age = 16; 3 this.sayName = function(){ 4 alert(this.name+this.age); 5 } 6 } 7 var student = function(){ 8 this.name = 'bote'; 9 Person.call(this); 10 } 11 var bote = new student(); 12 bote.sayName();
2.原型继承:通过Prototype属性继承,这个在上一篇文章中有详细的描述,这里就不再叙述
3.聚合:有时候,我们并不需要严格的继承,真正需要的是一个类(或几个类)中的某些函数方法,这时候我们就要用到聚合了。
介绍聚合之前需要先说一下掺元类(Mixin Classes),这是一种不需要用到严格的继承就可以复用代码的一种技术。这个类是用作扩展类的模版使用。
//准备将要聚合的函数 var JSON = { }; JSON.prototype = { toJSONString: function(){ var outPut = []; for(key in this){ outPut.push(key+"-->"+this[key]); } return outPut; } } //制作聚合函数,即一个掺元类,传入两个参数,子类和父类 function mixin(receivingclass,givingclass){ //遍历父类的原型中所有的原型函数 for(methodName in givingclass.prototype){ //如果子类的原型中不存在这个原型函数,就从父类那里继承过来 if(!receivingclass.prototype[methodName]){ receivingclass.prototype[methodName] = givingclass.prototype[methodName]; } } } //测试 var o = function(){ this.name = "yuan"; this.age = 24; } o.prototype = { toTest:function(){ alert(2); } }; mixin(o,JSON); var a = new o(); alert(a.toJSONString()); //弹出name-->yuan,age-->24,toTest-->function (){ alert(2); },toJSONString-->function (){ var outPut = []; for(key in this){ outPut.push(key+"-->"+this[key]); } return outPut; }
可以看出,我们通过mixin函数来选择性继承了JSON的toJSONString方法,而与父类方法明一样的toTest方法还是本身的原型方法。
这是使用函数定义的类,是这样使用的,如果使用直接量定义的类,我们只需要将聚合函数里的prototype改为__proto__即可,完全的聚合方法如下
function mixin(receivingclass,givingclass){ for(methodName in givingclass){ f(!receivingclass.__proto__[methodName]){ receivingclass.__proto__[methodName] = givingclass[methodName]; } } }
这样是对于只用直接量定义的类使用,如下
var o = {naem:"sda",age:22}; mixi(o,JSON); alert(o.toJSONString());
这样便将JSON原型里的toJSONString方法直接继承了。