组合继承

前面两篇我们了解到:原型链继承存在着引用类型问题,而借用构造函数又无法实现函数复用和原型方法继承的问题。那么能不能把两者结合一下,取其精华,弃其糟粕?答案是肯定的。那就是接下来我们要介绍的组合继承。

组合继承有时候也叫做伪经典继承,指的是将原型链和借用构造函数的技术组合到一起,从而发挥二者之长的一种继承模式。其思路就是使用原型链实现对原型属性和方法的继承。而通过借用构造函数来实现对实例属性的继承。这样既通过在原型上定义方法实现函数复用,又能保证每个实例都有它自己的属性。下面来看一个例子

function Father(name){this.name = name;this.colors = ['red','pink','green'];
}Father.prototype.sayName = function(){console.log(this.name)
}function Son(name, age){//属性继承Father.call(this, name);this.age = age;
}//方法继承
Son.prototype = new Father();
Son.prototype.sayAge = function(){console.log(this.age);
}var son1 = new Son('Alvin', 28);
son1.colors.push('yellow');
console.log(son1.colors); // red,pink,green,yellow
son1.sayName(); //Alvin
son2.sayAge(); //28var son2 = new Son('Semon', 29);
console.log(son2.colors);//red,pink,green
son2.sayName(); //Semon
son2.sayAge(); //29

在这个例子中,Father构造函数定义了两个属性:name和colors, Father的原型定义了一个方法sayName()。Son构造函数在调用Father的构造函数时传入了name参数,紧接着又定义了它自己的属性age。然后将Father的实例赋值给Son的原型,然后又在该新原型上定义了方法sayAge()。这样一来就可以让两个不同的Son实例既分别拥有自己的属性,又可以使用相同的方法了。

组合继承避免了原型链和借用构造函数的缺陷,融合了它们的有点,成为JavaScript中最长用的继承模式。

javascript 的七种继承方式(三)组合继承相关推荐

  1. JavaScript中七种函数调用方式及对应 this 的含义

    http://blog.sina.com.cn/s/blog_621f1e120100rj21.html this 在 JavaScript 开发中占有相当重要的地位,不过很多人对this这个东西都感 ...

  2. JS中对象的四种继承方式:class继承、原型链继承、构造函数继承、组合继承(构造函数和原型链继承的结合)

    前言 才发现之前没有对JavaScript中的继承做过总结,不过看得到是不少,接下来就对这几种继承方式做一下总结. class继承 class继承是ES6引入的标准的继承方式. ES6引入了class ...

  3. 详细解析JavaScript中的继承(包括组合继承和寄生式继承)

    继承:相信很多学习过Java等面向对象语言的同学,都会接触过继承,它们实现继承的主要方式是接口继承和实现继承.但由于JavaScript函数没有签名,所以无法实现接口继承.ECMAScript支持实现 ...

  4. 知识付费的七种变现方式

    知识付费的七种变现方式. 一在线问答 以文字.音频.视频等方式来对提问者的问题进行回答.只要你在某些领域有丰富的知识积累,那么你的回答就能得到提问者的青睐,就可以赚取相应的佣金.不过这种收益方式效果甚 ...

  5. 【数据库视频】七种连接方式

    数据表的查询与管理只是针对数据库中的一个表格进行的查询管理,如果现在我们想要同时的看到两个数据表中的数据的或,需要怎么实现?答案是:使用多连接的方式进行查询 标题中说了SQL中有七种连接的方式,那么具 ...

  6. JavaScript学习(五十五)—组合继承

    JavaScript学习(五十五)-组合继承 组合继承:就是借用构造方法继承和原型链继承的组合形式

  7. C++继承机制(三)——多继承、菱形继承、虚继承原理

    目录: C++继承机制(一)--基本语法.三种继承方式.继承哪些数据 C++继承机制(二)--继承中的构造和析构顺序.继承同名成员的处理方式 C++继承机制(三)--多继承.菱形继承.虚继承原理 本篇 ...

  8. 数据库的七种传播方式

    其实数据库的七种传播行为在网上查询了一下,和Spring中使用到的7种事务传播行为是没什么差别的,因为我写的博文基本和JAVA有相关,所以就结合Spring中事务传播和例子来讲一下咯. 事务传播行为如 ...

  9. 5G网络切片的七种武器(三)

    | 文章版权所有,未经授权请勿转载或使用 在公众号 [5G行业应用] 之前的两篇文章<5G网络切片的七种武器(一)>和<5G网络切片的七种武器(二)>中,我们介绍了5G网络切片 ...

最新文章

  1. VC++中使用MFC通过ADO连接数据库
  2. tkinter 10 messagebox 弹窗
  3. sklearn自学指南(part6)--使用手册的目录
  4. 什么是 SAP UI5 的 Hybrid Web Containers
  5. 【转载】#323 - A Generic Class is a Template for a Class
  6. 图论 —— 图的遍历
  7. Barefoot和Stordis在欧洲领导开源网络
  8. iphone电压测试软件,电压电击iPhone结果会怎样? 通过测试后, 照样可以正常开机...
  9. 如何打开苹果Mac触控板的三指拖移功能?
  10. oj 小黑华丽的逆袭机会
  11. 解决XCode 11 build error 编译错误 image not found
  12. java替换特殊字符_Java处理特殊字符替换(正则表达式)
  13. 数学建模matlab画图操作大全
  14. 干货分享:如何把APP软文推广做到好
  15. SpringBoot 动态添加定时任务
  16. python 正数变成负数_初一数学上册第一章有理数1.1正数和负数基础知识概括及同步练习题含解析...
  17. HDU6669 Game
  18. Docker学习笔记 — Swarm搭建Docker集群
  19. jstack详细介绍
  20. M OP N数值运算问题

热门文章

  1. 3D打印服务器Octoprint配置步骤
  2. 刘铁岩《良师益友》系列
  3. 供电企业的福音,远程抄表系统无线解决方案,让工程师告别奔波
  4. 程序员专用经典语录—看完笑一阵可以,千万不要死循环哦!
  5. 用neo4j导入protege创建的本体owl文件(以及前缀消除)
  6. 晶体振荡器与晶体谐振器的区别
  7. 可动平行平板电容建模策略
  8. .NET 请求被挂起,前端轮询,委托
  9. oracle期间平均成本,小李飞刀系列之Oracle EBS期间平均成本(PAC)--生产成本计算(四)制造费用设置及成本计算...
  10. logitech摄像头 linux,logitech webcam linux 驱动安装