js基础之继承

2023-11-10

js继承:是指一个对象可以继承另一个对象的属性和方法,以便利用现有的代码来创建新的对象。
在JavaScript中,继承主要有以下几种常见的实现方式

  1. 通过原型链继承
  2. 构造函数继承
  3. 组合继承(即原型链继承+构造函数继承)
  4. 寄生组合继承
  5. es6类的继承

下面就这五种继承,分别介绍一下

原型链继承

原理

首先要知道原型链是什么?如下图示,理解一下

原型链
原型继承的原理就是 把子类的原型指向父类的实例

示例

// 定义一个People构造函数
function People() {
  this.head = 1
  this.leg = 2
  this.hand = 2
  this.ary = ['张三', '李四']
  this.say = function () {
    console.log('说废话')
  }
}
// 子类1
function Man() {}
// 子类2
function Woman() {}
// 子类1继承
Man.prototype = new People()
Man.prototype.contructor = Man
// 子类2继承
Woman.prototype = new People()
Woman.prototype.contructor = Woman
// 子类的原型上添加一个test方法
Man.prototype.test = function () {}
const man1 = new Man()
const man2 = new Man()
const woman1 = new Woman()
man1.ary.push('王五')
console.log(man1)
console.log(man2)
console.log(woman1.ary)

在这里插入图片描述

原理

综上,原型继承存在两个问题

  1. 父类中的所有引用类型的属性(比如上面的ary),会被子类中所有的实例(如man1,man2)共享(除非去创建多个子类,不同子类实例之间不会影响)
  2. 子类实例不能给父类构造函数传参

构造函数继承

原理

在子构造函数中使用call或apply方法调用父类构造函数,将父类的属性和方法复制给子类,从而实现继承。

示例

// 定义一个People构造函数
function People() {
  this.head = 1
  this.leg = 2
  this.hand = 2
  this.ary = ['张三', '李四']
  this.say = function () {
    console.log('说废话')
  }
}
// 构造函数原型上添加方法
People.prototype.test = function () {
  console.log(123)
}
// 构造函数继承
function Man() {
  People.call(this)
}
let man1 = new Man()
let man2 = new Man()
man1.ary.push('王五')

console.log(man1, man2)
console.log(man1.test()) // 是否存在父构造函数原型上的方法?不存在

在这里插入图片描述

问题

无法继承父构造函数原型上的属性或方法

组合继承

原理

原型继承和构造函数继承的结合
解决了原型继承和构造函数继承存在的问题,它可以继承父类原型链上的属性和方法,同时也可以避免子类实例共享父类实例属性的问题,也可以在调用父类构造函数时传递参数

示例

// 定义一个People构造函数
function People() {
  this.head = 1
  this.leg = 2
  this.hand = 2
  this.ary = ['张三', '李四']
  this.say = function () {
    console.log('说废话')
  }
}
// 构造函数原型上添加方法
People.prototype.test = function () {
  console.log(123)
}
// 构造函数继承
function Man() {
  People.call(this) // 在这里可以调用父类构造函数传参  People.call(this,...args) 
}
// 原型继承
Man.prototype = new People()
let man1 = new Man()
let man2 = new Man()
man1.ary.push('王五')
console.log(man1.test()) // 123
console.log(man1, man2)

在这里插入图片描述

问题

虽然解决了原型继承和构造函数继承存在的问题
但是,仍存在问题:
父类构造函数被调用了两次,一次是在子类构造函数中,另一次是在子类原型对象中,
可能存在一定的性能影响。

寄生组合继承

原理

寄生组合式继承其实就是寄生继承+组合继承

什么是寄生继承呢?
寄生继承的原理就是创建一个新对象,然后将要继承的对象作为新对象的原型,然后再为新对象添加新的属性和方法,从而实现继承。

// 寄生继承
// 其实就是Object.create()的原理
function createObject(obj) {
  function F() {} // 创建一个函数
  F.prototype = obj; // 将函数的原型指向新对象
  return new F(); // 返回函数的实例对象
}

示例

// 定义一个People构造函数
function People() {
  this.head = 1
  this.leg = 2
  this.hand = 2
  this.ary = ['张三', '李四']
  this.say = function () {
    console.log('说废话')
  }
}
// 构造函数原型上添加方法
People.prototype.test = function () {
  console.log(123)
}
// 构造函数继承
function Man() {
  People.call(this)
}
// 不直接去原型继承了
// Man.prototype = new People()
// 而是创建一个新函数
const Fn = function () {}
Fn.prototype = People.prototype
Man.prototype = new Fn()

let man1 = new Man()
let man2 = new Man()
man1.ary.push('王五')
console.log(man1.test())
console.log(man1, man2)

问题

相对完美的一种继承方式,解决了上面存在的问题

es6类继承

原理

在ES6中,通过定义一个类来创建一个对象,然后通过extends和super关键字来继承另一个类的属性和方法。

示例

class Parent {
  constructor(name,age){
    this.name = name
    this.age = age
  }
  sayName(){
    console.log(this.name);
  }
}
// extends 继承父类
class Child extends Parent{
  constructor(name,age,gender){
    // 继承属性
    super(name,age)
    this.gender = gender
  }
  sayGender(){
    console.log(this.gender);
  }
}
const ming = new Child('ming',18,'男')
const ming1 = new Child('ming1',19,'女')
// ming.sayGender()
// ming.sayName()
console.log(ming.name);
console.log(ming1.name);
console.log(ming.age);
console.log(ming1.age);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js基础之继承 的相关文章

随机推荐

  • linux 多块磁盘挂一个文件夹,Linux单目录挂载多块磁盘

    Linux将多块磁盘挂载到一个目录 特此记录 方便以后使用 服务器需要保存大量图片 内含4块2T的磁盘 需要将磁盘挂载到影像目录 单块磁盘挂载比较简单 创建分区 格式化分区 挂载 同一目录无法重复挂载 后挂载的会覆盖之前挂载的磁盘 但是现在
  • python强化学习--gym安装与使用

    最近开始学习强化学习 第一步肯定是要学会安装和使用pym 原本以为很简单 事实上确实很简单 但是遇到一个小问题 就是安装gym之后 在应用的过程中 游戏界面没有显示出来 了解后才知道是gym版本不对 一种可用的版本匹配是 python 3
  • 前端面试题汇总

    总结一下前端面试官会经常问到的一些面试题 目录 总结一下前端面试官会经常问到的一些面试题 一阶段 HTML5 CSS3 隐藏页面中某个元素的办法 区别 请说明 px em rem vw vh rpx 等单位的特性 什么是 BFC 盒子模型总
  • JAVA课程设计(小游戏贪吃蛇)完整源码附素材(一)

    JAVA课程设计 小游戏贪吃蛇 完整源码附素材 一 JAVA课程设计 小游戏贪吃蛇 完整源码附素材 二 JAVA课程设计 小游戏贪吃蛇 完整源码附素材 三 文章目录 前言 一 任务描述 1 1 课程设计目的 1 2 课程设计内容和要求 二
  • 设计一个回合制战斗系统Combat(C++)

    C 设计一个回合制战斗系统Combat 目录 C 设计一个回合制战斗系统Combat 题目 重要提醒 Soldier类 Wizard类 Master类 Warsystem类 题目 设计和实现回合制战斗系统Combat 1 Soldier战士
  • Weex学习第二篇:Hello world

    曾经何时 我以为学习一门语言或者是新技术 只要能写出Hello world 就算是学会了 这个思想困扰了我很久 以至于之前整理电脑的时候发现php python ruby phonegap react native go node js n
  • Windows中的WSL2(子系统)开机启动配置

    常规做法 通常在Linux中开机启动可以通过 1 编辑 etc rc loacl 2 在 etc init d 下添加启动脚本 3 配置systemd 但这几种方式在子系统中无法使用 我们可以通过Windows 间接的启动子系统中的服务 在
  • C#基础(json解析)

    json是一种轻量级的数据交换格式 采用完全独立于语言的文本格式 易于解析和生成 在c 中 解析json数据通常是利用vs中自带的litjson包 然后进行解析 首先新建一个文本文件 创建一个json数据 如下 id 1 name 寄生者
  • Jenkins学习笔记第九篇pipeline 接口自动化持续集成测试

    Scripts Pipeline 基于groovy的语法 Declarative pipeline V2 5之后引入 结构化方式 script pipeline书写形式如下 node def mvnHome stage Preparatio
  • secureCRT 登录Ubuntu20.04提示Key exchange failed. No compatible key exchange method

    问题描述 之前在Ubuntu18 04上按照博客文章 ubuntu18 04系统搭建以及配置 配置ssh 登录是没有问题的 但最新新的项目需要安装Ubuntu20 04 在安装了ubuntu20 04后 以前老版本的secureCRT通过s
  • springboot2.x redis Lettuce版本使用时报错

    springboot2 x redis Lettuce版本使用时报错 springboot2 x redis使用时报错 原因 解决方法 springboot2 x redis使用时报错 原因 在springboot2 x 以后 官方默认使用
  • Unity中行星和恒星的旋转——Rotate和RotateAround

    Unity中的旋转 以行星环绕为例 实现效果 一 与之相关的两种旋转方式 1 Rotate 2 transform RotateAround 二 行星案例的实现 Step1 我们先在场景中创建一个球体 并将它放大作为被环绕的恒星 我这里自己
  • 范数的数学意义

    L0 L1 L2范数的数学意义 如有不当 敬请斧正 Tips 范数所表示的一些数学意义 众数 中位数 均值 A mathcal A A L0范数 求L0范数最小时 表示的是数据中的众数modes 假设
  • 家里电脑dnf无线连接服务器,win7系统dnf正在连接服务器的解决方法

    我们在操作win7系统电脑的时候 常常会遇到 2 关闭后点击 开始游戏即可正常进入游戏 出现这样的现象是由于当前win7系统电脑与dnf游戏服务器连接失败导致的 这个问题早在以往就会有发生 但是到了跨区合并游戏大区后问题又被进一步放大了 和
  • windows一键安装mysql脚本bat

    下载需要的zip版本的mysql压缩文件 解压 在bin目录创建mysql init bat 复制内容保存 cd dp0 cd del cd my ini echo 删除完成 echo mysqld gt gt my ini echo 设置
  • python接收mysql语句进行查询

    mysql语句作为外部参数传入进行查询 最近在做自动化测试时遇到一个问题 需要将sql语句传入python脚本里面进行查询 支持不同类型的sql语句 只需在外部修改sql语句就可以进行mysql的增删改查 代码 coding utf 8 i
  • CSS(简)

    CSS CSS概述 CSS是 Cascading Style Sheets 级联样式表 CSS是一种样式表语言 用于为HTML文档控制外观 定义布局 例如 CSS涉及字体 颜色 边距 高度 宽度 背景图像 高级定位等方面 可将页面的内容与表
  • C语言中求和、计算平均值、方差和标准差

    计算C语言中的求和 标准差 方差和标准差等 需要加上头文件 include
  • SpringBoot笔记梳理

    本次笔记目录结构如下 1 SpringBoot自动配置原理 2 SpringBoot获取模块bean的几种方式 2 1 包路径放大 import注解进行导入配置类 2 2 自定义注解 EnableUse 2 3 使用ImportSector
  • js基础之继承

    js继承 是指一个对象可以继承另一个对象的属性和方法 以便利用现有的代码来创建新的对象 在JavaScript中 继承主要有以下几种常见的实现方式 通过原型链继承 构造函数继承 组合继承 即原型链继承 构造函数继承 寄生组合继承 es6类的