说到面向对象这个破玩意,曾经一度我都处于很懵逼的状态,那么面向对象究竟是什么呢?其实说白了,所谓面向对象,就是基于类这个概念,来实现封装、继承和多态的一种编程思想罢了。今天我们就来说一下这其中继承的问题。

  好,先不直接上代码,而是反手来一波文字说明,捋一捋思路。

  曾经一段时间因为javascript关于类实现继承的不规范,导致各种各样实现继承的代码;而实际上不管代码怎么变,继承都基于两种方式:

  1.通过原型链,即子类的原型指向父类的实例从而实现原型共享。
  2.借用构造函数,即通过js的apply、call实现子类调用父类的属性、方法;
  原型链方式可以实现所有属性方法共享,但无法做到属性、方法独享(例如son1指向的是父类实例,son2,son3同样如此,大家都是吃的同一碗饭);

  而借用构造函数除了能独享属性、方法外还能在子类构造函数中传递参数,但代码无法复用。总体而言就是可以实现所有属性方法独享,但无法做到属性、方法共享(例如,son1新增了一个函数,然后想让son2、son3一起用的话就无法实现了,只能son2,son3各自在构造函数中新增)。

  组合继承就是把以上两种继承方式一起使用,把共享的属性、方法用原型链继承实现,独享的属性、方法用借用构造函数实现,所以组合继承几乎完美实现了js的继承;
为什么说是“几乎”?因为后来人们发现组合继承有一个小bug,实现的时候调用了两次父类,性能上不合格啊有木有!怎么解决呢?于是“寄生继承”就出来了。

  寄生继承:
  简单而言,寄生继承就是不用实例化父类了,直接实例化一个临时副本实现了相同的原型链继承。(即子类的原型指向父类原型的副本),如此一来,这个问题就完美解决了。

  接下来是代码部分:
  
这里我们通过apply方法给儿子传了私有属性,但是父类原型上的方法是无法调用的。
然后我们试试通过原型链来实现继承。
这样一来就把父类的全部东西都一股脑继承下来了,而且我这里如果Sons修改了父类的原型,其他跟着用的比如Daughters也要跟着遭殃。
而组合继承这时候就出来了,组合继承就是把以上两种继承方式一起使用,把共享的属性、方法用原型链继承实现;独享的属性、方法用借用构造函数实现。至于寄生组合继承,它是为了解决组合继承会二次调用父类这个bug出现的优化方法,具体实现如下:
在这一步,无论是儿子还是女儿,都能成功调用父类的公用方法。接着在末尾添加两行代码往下看:
两个say方法虽然同名,却互不影响。最后调用父类的私有属性看看:
只有儿子利用私有属性拿到了secret,而女儿没有拿到,完美解决共享与独享分配的问题!

转载于:https://www.cnblogs.com/zhangnan35/p/8473061.html

捋一捋js面向对象的继承问题相关推荐

  1. js面向对象和继承的碎碎念

    2019独角兽企业重金招聘Python工程师标准>>> 一.prototype属性的特点: 1.定义在prototype中的方法是"实例方法",必须是new出来的 ...

  2. JS面向对象的程序设计之继承-继承的实现-借用构造函数

    JS面向对象的程序设计之继承-继承的实现-借用构造函数 前言:最近在细读Javascript高级程序设计,对于我而言,中文版,书中很多地方翻译的差强人意,所以用自己所理解的,尝试解读下.如有纰漏或错误 ...

  3. JS 面向对象编程、原型链、原型继承(个人学习总结)

    一.面向对象 1. 面向对象 是所有语言 都有的一种编程思想,组织代码的一种形式 基于对象的语言:JS语言 面向对象的语言:c++ java c# 2. 面向对象 3大特征 封装:将重用代码封装到函数 ...

  4. js面向对象之封装,继承,多态,类的详解

    封装 在面向对象的操作中,我们有完全不同的一些写法. 想要封装我们的对象,就要用到构造函数.我们需要创建构造函数,构造函数和函数一致,都是通过function创建的 首字母大写(规范,为了和普通函数进 ...

  5. JavaScript(JS) 面向对象(封装、继承、多态)

    面向对象是把事物给对象化,包括其属性和行为.面向对象编程更贴近实际生活的思想.可以简单的理解面向对象的底层还是面向过程,面向过程抽象成类,然后封装,方便使用就是面向对象.本文主要介绍JavaScrip ...

  6. js中的面向对象、继承、函数重写

    通过示例讲解 一下,先看一个示例 示例demo: <script>//创建一个父函数(父类)var Mammal = function (name) {this.name = name;} ...

  7. JS面向对象一:MVC的面向对象封装

    JS面向对象一:MVC的面向对象封装 MDNjavascript面向对象 面向对象(Object-Oriented) 面向对象里面向的意思是以...为主,面向对象编程既以对象为主的编程. 面向对象的一 ...

  8. 简单粗暴地理解js原型链–js面向对象编程

    简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...

  9. 对js面向对象的理解

    转自:http://www.cnblogs.com/jingwhale/p/4678656.html js面向对象理解 ECMAScript 有两种开发模式:1.函数式(过程化),2.面向对象(OOP ...

最新文章

  1. 指纹传感器沾水便失效的原因解析
  2. SAP RETAIL 如何确定自动补货触发的单据类型 II
  3. 查看计算机用户创建时间,敬业签在电脑端怎样查看团签内容的创建时间?
  4. Jsoup代码解读之一-概述
  5. 【设计模式 04】代理模式
  6. spark学习-54-Spark RDD的clean()方法
  7. 上海交通大学2002年数学分析考研试题
  8. mysql中CONCAT值为空的问题解决办法
  9. 计算机开机无讯号,【图片】电脑突然开机没反应,显示器没信号!~【显卡吧】_百度贴吧...
  10. 自己实现一个简易web服务器
  11. 简单的Mysql常用命令
  12. Android开发之Activity(实现Activity跳转)
  13. C语言PAT乙级试题答案1016
  14. c语言饭卡管理系统_C语言饭卡管理系统(附代码) -
  15. 笔记本风扇控制程序,支持蓝天模具笔记本
  16. Vue3 Vite 项目踩坑札记
  17. 麻省理工大学计算机中心,Massachusetts Institute of Technology 麻省理工大学
  18. 2016.03.07错误记录
  19. 呼叫中心-自动外呼接口设置
  20. 返回多字段并用数组分割方式展示

热门文章

  1. MSP430F5XXX中的ADC12使用
  2. 【语义分割】ICCV21_Mining Contextual Information Beyond Image for Semantic Segmentation
  3. Ubuntu中配置SSH服务
  4. linux c 服务程序,Linux C 后台服务程序单进程控制
  5. 2021 高考 成绩查询,精准预测!2021全国大学录取分数线表查询
  6. 9月份计算机应用基础统考,2018年9月计算机应用基础统考题库-网考计算机应用基础真题1...
  7. linux so_nosigpipe,TCP_NODELAY/SO_LINGER/SO_NOSIGPIPE/MSG_NOSIGNAL设置
  8. mysql分页查询减轻压力_mysql分页查询优化
  9. DICOM的常用Tag分类和说明
  10. 《见字如面》赏析-待续