欢迎大家关注我的公众号【老周聊架构】,Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。

1、原型链继承

核心: 将父类的实例作为子类的原型

缺点: 父类新增原型方法/原型属性,子类都能访问到,父类一变其它的都变了

function Person (name) {this.name = name;};Person.prototype.getName = function () {    //对原型进行扩展return this.name;};function Parent (age) {this.age = age;};Parent.prototype = new Person('riemann');   //这一句是关键 //通过构造器函数创建出一个新对象,把老对象的东西都拿过来。Parent.prototype.getAge = function () {return this.age;};//        Parent.prototype.getName = function () {   //可以重写从父类继承来的方法,会优先调用自己的。
//            console.log(222);
//        };var result = new Parent(22);console.log(result.getName());  //riemann  //调用了从Person原型中继承来的方法(继承到了当前对象的原型中)  console.log(result.getAge());   //26   //调用了从Parent原型中扩展来的方法

2、构造继承

基本思想

借用构造函数的基本思想就是利用call或者apply把父类中通过this指定的属性和方法复制(借用)到子类创建的实例中。
因为this对象是在运行时基于函数的执行环境绑定的。也就是说,在全局中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。
call、apply 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

所以,这个借用构造函数就是,new对象的时候(new创建的时候,this指向创建的这个实例),创建了一个新的实例对象,
并且执行Parent里面的代码,而Parent里面用call调用了Person,也就是说把this指向改成了指向新的实例,
所以就会把Person里面的this相关属性和方法赋值到新的实例上,而不是赋值到Person上面,
所以所有实例中就拥有了父类定义的这些this的属性和方法。

因为属性是绑定到this上面的,所以调用的时候才赋到相应的实例中,各个实例的值就不会互相影响了。

核心:使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(没用到原型)

缺点: 方法都在构造函数中定义, 只能继承父类的实例属性和方法,不能继承原型属性/方法,无法实现函数复用,每个子类都有父类实例函数的副本,影响性能

3、组合继承

组合继承(所有的实例都能拥有自己的属性,并且可以使用相同的方法,组合继承避免了原型链和借用构造函数的缺陷,结合了两个的优点,是最常用的继承方式)

核心:通过调用父类构造,继承父类的属性并保留传参的优点,然后再通过将父类实例作为子类原型,实现函数复用

缺点:调用了两次父类构造函数,生成了两份实例(子类实例将子类原型上的那份屏蔽了)

function Person  (name) {this.name = name;this.friends = ['andy','edgar'];};Person.prototype.getName = function () {return this.name;};function Parent (age) {Person.call(this,'riemann');  //这一步很关键this.age = age;};Parent.prototype = new Person('riemann');  //这一步也很关键var result = new Parent(24);console.log(result.name);    //riemannresult.friends.push("小智");  //console.log(result.friends);  //['andy','edgar','max']console.log(result.getName());  //riemannconsole.log(result.age);    //26var result1 = new Parent(26);   //通过借用构造函数都有自己的属性,通过原型享用公共的方法console.log(result1.name);  //riemannconsole.log(result1.friends);  //['andy','edgar']

4、寄生组合继承

核心:通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例方法/属性,避免的组合继承的缺点

缺点:堪称完美,但实现较为复杂

function Person(name) {this.name = name;this.friends = ['andy','edgar'];}Person.prototype.getName = function () {return this.name;};function Parent(age) {Person.call(this,"riemann");this.age = age;}(function () {var Super = function () {};     // 创建一个没有实例方法的类Super.prototype = Person.prototype;Parent.prototype = new Super();     //将实例作为子类的原型})();var result = new Parent(26);console.log(result.name);console.log(result.friends);console.log(result.getName());console.log(result.age);

javascript 面向对象(实现继承的几种方式)相关推荐

  1. JavaScript笔记 - 对象继承的几种方式

    1)对象冒充 2)call方式 3)apply方式 4)原型链 5)混合方式 1)对象冒充 Js代码 function People(name, age) { this.name = name; th ...

  2. JavaScript(js)实现继承的几种方式

    1.原型链继承 核心:将父类的实例做为子类的原型对象 //动物类function Animal(name,sex) {this.name = name || 'Animal';this.sex = s ...

  3. JS 总结之原型继承的几种方式

    在之前的总结中,我们详细分析了原型<JS 总结之原型>,原型很大作用用于模拟继承,这一次,我们来聊原型继承的几种方式. function Person (age) {this.age = ...

  4. 继承有几种方式,分别是什么,想要实现继承可以使用哪些方法

    这里是修真院前端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析前端知识/技能,本篇分享的是: [继承有几种方式 ...

  5. Django中Model继承的三种方式

    Django中Model继承的三种方式 Django中Model的继承有三种: 1.抽象继承 2.多表继承 3.proxy model(代理model) 1.抽象继承 第一种抽象继承,创建一个通用父类 ...

  6. jquery、javascript实现(get、post两种方式)跨域解决方法

     jquery.javascript实现(get.post两种方式)跨域解决方法 一.实现get方式跨域请求数据 浏览器端 <script> $(document).ready(fun ...

  7. JavaScript 生成唯一ID的几种方式

    这篇文章主要介绍了JavaScript 生成唯一ID的几种方式,帮助大家更好的理解和使用JavaScript,感兴趣的朋友可以了解下. 编程的世界里,在很多的时候,我们都需要一个唯一的ID来代表一些数 ...

  8. 可以实现继承的几种方式

    继承的几种方式 说起继承,又是一个老生常谈的问题了.今天来讲讲继承的几种方法以及他们的优缺点吧. 源码地址:点击这里 一.原型链继承 原型链继承:通过原型将一个引用类型继承另一个引用类型的属性和方法. ...

  9. javaScript中创建数组的3种方式

    JS数组定义及详解 javascript如何定义数组? 直接上代码和截图 //javaScript中创建数组的3种方式 //方式1 var names = ["令狐冲", &quo ...

最新文章

  1. 淘宝flink和storm书籍调研
  2. RSS 没有死亡 而是无所不在
  3. python代码测试 vim_用 Hypothesis 快速测试你的 Python 代码
  4. 标准盒子与IE盒子的区别
  5. 【算法学习】【图像增强】【Retinex】White Patch Retinex 程序解读
  6. AndroidQQ登录接入详细介绍(kotlin搭建)
  7. 可靠性五性分析标准和国军标参考(文件分享)
  8. 数学建模——SPSS的非参数检验
  9. iOS人脸识别(CoreImage)
  10. 关于APS生产排产软件选择,有哪几个要素?
  11. 夜神模拟器连接手柄无反应_夜神模拟器手柄设置
  12. oracle存货转资产,存货转固定资产账务处理
  13. 人民币对美元汇率中间价报6.7472元 上调469个基点
  14. 普元中间件Primeton AppServer6.5安装(Windows)
  15. 面向政府治理大数据的高性能计算系统
  16. 无人洗车小程序源码开发
  17. mysql查询学校开设总课程数_MYSQL数据库课程设计
  18. 买了一台云服务器能干嘛
  19. 简答题合集-管理经济学
  20. sklearn 笔记:高斯过程

热门文章

  1. python 过滤中文、英文特殊符号
  2. 桁架工业机器人编程_桁架机器人的制作方法
  3. python爬取大众点评数据_Python 爬取大众点评 50 页数据,最好吃的成都火锅竟是它!...
  4. 8月,Github 最热开源项目排行榜来啦
  5. 基于工业物联网的中央空调节能控制系统
  6. 自己做在线HTML编辑器,#6 从零开始制作在线 代码编辑器
  7. 计算机导师制工作手册模板,学生成长导师制工作手册
  8. 百度是否收录批量查询工具
  9. cmd批量修改文件名 增加文字_CMD批量修改文件名的批处理方法
  10. Pytorch中的NLLLoss代码解释