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

之前写过了类和原型,这里再说聚合,在写关于聚合之前,对与继承我再总结一下。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方法直接继承了。

原文地址:https://www.cnblogs.com/LVPlum/p/5533685.html