• 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方法直接继承了。

  • 相关阅读:
    SSH深度历险(五) 深入浅出-----IOC AND AOP
    Hbuilder X下载及安装教程
    如何用Prometheus监控十万container的Kubernetes集群
    使用并部署Flutter Web的步骤实例
    回顾 Android 11 中的存储机制更新
    移动端UI一致性解决方案
    使用 tail 结合 grep 查找日志关键字并高亮及显示所在行上下文
    Nginx PHP 报504 Gateway time-out错误的解决方法
    SPSS 24 安装详细教程及下载
    CoRL 2020奖项公布,斯坦福获最佳论文奖,华为等摘得最佳系统论文奖
  • 原文地址:https://www.cnblogs.com/LVPlum/p/5533685.html
Copyright © 2020-2023  润新知