JavaScript继承与聚合实例详解


Posted in Javascript onJanuary 22, 2019

本文实例讲述了JavaScript继承与聚合。分享给大家供大家参考,具体如下:

一、继承

第一种方式:类与被继承类直接耦合度高

1. 首先,准备一个可以被继承的类(父类),例如

//创建一个人员类
function Person(name) {//现在Person里面的域是由Person里面的
来this来控制的
  this.name=name;
}

2. 然后,有个需要继承父类的子类

function Teacher(name,books) {
  Person.call(this,name);//相当于java中的super函数 在new Teacher时将Person的name初始化
  this.books=books;
}

说明一下:

(1)call方法可以将一个函数的对象上下文从初始化变成由this来决定一个类去控制另一个类

(2)Teacher类去控制 Person类 用Teacher域里面的 this来控制Person域里面的 this

(3)调用 Perosn的构造函数,因为Perosn没有用 new 所以是个空对象(模板)     显示调用call方法,可以初始化 Person

3. 最后,实现继承

(步骤1)先继承

Teacher.prototype=new Person();
Teacher.prototype.constructor=Teacher;//确保继承后任然是Teacher自己的构造函数

(步骤2)为子类扩展一些方法,用于访问从父类继承的内容

Teacher.prototype.getBook=function () {
  return this.name+" "+this.books;
}

(步骤3)使用已经继承好的类

var jim=new Teacher("Jim","Javascript");
alert(jim.getBook())

总结:此种方法是直接在子类中显示调用父类,耦合度高,复用性差。

第二种方式,使用封装,完成程序中所用继承操作

1. 首先,准备一个可以被继承的类(父类),例如

//创建一个人员类
function Person(name) {//现在Person里面的域由Person里面的来this来控制的
  this.name=name;
}

2. 创建extend函数为了程序中所有的继承操作(最重要的地方)

/*创建extend函数为了程序中所有的继承操作*/
//subClass:子类 superClass:超类(2)
function extend(subClass,superClass) {
    //1,使子类原型属性等于父类的原型属性
    //初始化一个中间空对象,目的是为了转换主父关系
    var F = function () {};
    F.prototype = superClass.prototype;
    //2, 让子类继承F
    subClass.prototype = new F();
    subClass.prototype.constructor = subClass;
    //3,为子类增加属性 superClass ==》原型链的引用
    subClass.superClass = superClass.prototype;
    //4,增加一个保险,就算你的原型类是超类(Object)那么也要把你的构造函数级别降下来  【说明一些:这里只是其中一个简单的保险,其余情况后续增加。。。】
    if (superClass.prototype.constructor == Object.prototype.constructor) {
      superClass.prototype.constructor = superClass;
    }
}

3. 有一个需要继承其他类的子类

function Author(name,books) {
  Author.superClass.constructor.call(this,name);//没有直接写父类,降低了耦合度
  //Person.call(this,name)  直接写Person代表其构造函数
  this.books=books;
  this.getBooks=function () {
    return this.name+" "+this.books ;
  }
}

4. 最后,实现继承

//继承
extend(Author,Person);//(子类,父类)

5. 使用已经继承好的类

var peter=new Author("Peter","Javascript");
alert(peter.getBooks());

方式二图解为:

 JavaScript继承与聚合实例详解

这里可能会有一个疑问就是为啥要使用中间类???

这里假如没有中间类的话,我们在实例化子类时就需要为父类传递一些相应的参数,这样的话,该句代码

Author.superClass.constructor.call(this,name);

就不能放在子类(Author)中,而是需要放入到extend中,这样的话代码的通用性就很低,故此需要使用中间类。

二、聚合

使用聚合的原因,有的时候不需要严格的继承,我们真正需要的是一个类(或几个类)中的一些函数。故此我们可以使用聚合 也就是使用 掺元类

 对于聚合有两种情况

第一种是聚合到 var a={}空类或者不是用function声明的类中

1. 首先,需要一个合适的可以被聚合的类(给体),此时需要在本类的内部进行扩展属性,方法

var JSON={//写到类的内部
    toJsonString:function () {
      var output=[];
      for(key in this){//this代表那个调用,就指向那个一个对象
        output.push(key+"---->"+this[key]);
      }
      return output;
    }
};

2. 制作一个聚合函数(最重要)

/*聚合函数
receivingClass:接受聚合内容的类
givingClass:被聚合的目标类
* */
function mixin(receivingClass,givingClass){
    for(methodName in givingClass){
      if(!receivingClass.__proto__[methodName]){//判断当前原型中是否含有即将要被聚合的方法,若没有则聚合进来
        receivingClass.__proto__[methodName]=givingClass[methodName];//直接获得类中的方法,因为方法是直接写在方法内部的。
      }
    }
}

3. 接受聚合的类(受体)

var get={name:"Text",age:20};

4. 实现将JSON类的方法聚合到类get中

mixin(get,JSON);//(受体,给体)

5. 使用get类中聚合的方法

document.write(get.toJsonString().join(","));

第二种是聚合用function声明的类中

var a=function(){}

1. 首先,需要一个合适的可以被聚合的类(给体),此时需要在本类的原型对象上进行扩展属性,方法

var JSON={};
JSON.prototype={//写到类的原型对象上
 toJsonString:function () {
 var output=[];
 for(key in this){//this代表那个调用,就指向那个一个对象
 output.push(key+"---->"+this[key]);
 }
 return output;
 }
}

2. 制作一个聚合函数

(2)制作聚合函数(receivingClass中聚合givingClass中的属性,或者方法)

function mixin(receivingClass,givingClass) {
 for(methodName in givingClass.prototype){
 if(!receivingClass.prototype[methodName]){//判断当前原型中是否含有即将要被聚合的方法,若没有则聚合进来
 receivingClass.prototype[methodName]=givingClass.prototype[methodName];
 }
 }
}

3. 接受 聚合的类(受体)

var o=function () {
 this.name="聚合";
 this.age=19;
}

4. 实现JSON类到o类的聚合(将JSON类中的方法聚合到o类中)

mixin(o,JSON);//(受体,给体)

5. 使用o类中聚合而来的方法

var useO=new o();
document.write(useO.toJsonString().join(","));

第二种图解理解为:

 JavaScript继承与聚合实例详解

该方式属于类o上一层的聚合。

更多关于JavaScript相关内容还可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript禁止页面操作的示例代码
Dec 17 Javascript
jQuery的animate函数学习记录
Aug 08 Javascript
JavaScript基于原型链的继承
Jun 22 Javascript
Ext JS动态加载JavaScript创建窗体的方法
Jun 23 Javascript
第一次接触神奇的Bootstrap基础排版
Jul 26 Javascript
AngularJS通过$http和服务器通信详解
Sep 21 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
Nov 07 Javascript
JS设置时间无效问题的解决办法
Feb 18 Javascript
简单理解Vue中的nextTick方法
Jan 30 Javascript
微信小程序中使用ECharts 异步加载数据实现图表功能
Jul 13 Javascript
Vue中的验证登录状态的实现方法
Mar 09 Javascript
微信小程序实现弹幕墙(祝福墙)
Nov 18 Javascript
JavaScript格式化json和xml的方法示例
Jan 22 #Javascript
基于vue的验证码组件的示例代码
Jan 22 #Javascript
JavaScript中的"=、==、==="区别讲解
Jan 22 #Javascript
深入分析element ScrollBar滚动组件源码
Jan 22 #Javascript
js实现京东秒杀倒计时功能
Jan 21 #Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
Jan 21 #Javascript
JavaScript使用Math.random()生成简单的验证码
Jan 21 #Javascript
You might like
PHP 动态生成静态HTML页面示例代码
2014/01/15 PHP
php防止恶意刷新与刷票的方法
2014/11/21 PHP
PHP实现二维数组根据key进行排序的方法
2016/12/30 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
2017/01/12 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
JS跨域代码片段
2012/08/30 Javascript
js为数字添加逗号并格式化数字的代码
2013/08/23 Javascript
js设置组合快捷键/tabindex功能的方法
2013/11/21 Javascript
JS的get和set使用示例
2014/02/20 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
2017/01/08 Javascript
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
Django1.7+JQuery+Ajax验证用户注册集成小例子
2017/04/08 jQuery
jQuery绑定事件方法及区别(bind,click,on,live,one)
2017/08/14 jQuery
node实现基于token的身份验证
2018/04/09 Javascript
layer 刷新某个页面的实现方法
2019/09/05 Javascript
js实现经典贪吃蛇小游戏
2020/03/19 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
JavaScript十大取整方法实例教程
2020/12/03 Javascript
手把手教你如何编译打包video.js
2020/12/09 Javascript
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
[03:16]DOTA2完美大师赛主赛事首日集锦
2017/11/23 DOTA
极简的Python入门指引
2015/04/01 Python
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
基于pip install django失败时的解决方法
2018/06/12 Python
利用selenium爬虫抓取数据的基础教程
2019/06/10 Python
Python 异常处理Ⅳ过程图解
2019/10/18 Python
python 读取更新中的log 或其它文本方式
2019/12/24 Python
基于python计算并显示日间、星期客流高峰
2020/05/07 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
党的群众路线教育实践活动自我剖析材料
2014/10/08 职场文书
MySQL 使用SQL语句修改表名的实现
2021/04/07 MySQL
阿里云服务器搭建Php+Apache运行环境的详细过程
2021/05/15 PHP
MySql 8.0及对应驱动包匹配的注意点说明
2021/06/23 MySQL
浅谈css实现背景颜色半透明的两种方法
2021/12/06 HTML / CSS
vue3语法糖内的defineProps及defineEmits
2022/04/14 Vue.js