JavaScript的面向对象编程(OOP)(三)——聚合

时间:2023-08-01 14:11:56

之前写过了类和原型,这里再说聚合,在写关于聚合之前,对与继承我再总结一下。JavaScript中关于继承的方式一共有三种,之前写了两种,但是没有说明,这里补充说明一下。

1.类式继承:通过在函数对象内调用父类的构造函数,使自身获得父类的属性和方法。主要使用call和apply回调

 var Person = function(){
this.age = 16;
this.sayName = function(){
alert(this.name+this.age);
}
}
var student = function(){
this.name = 'bote';
Person.call(this);
}
var bote = new student();
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方法直接继承了。