js实现继承属性和方法

news2024/11/17 21:47:21

js实现继承属性和方法

  • 1 使用extends实现继承
  • 2 原型链继承
  • 3 组合继承
  • 4 寄生组合继承
  • 5 实例继承
  • 6 拷贝继承
  • 7 扩展
    • 7.1 函数中方法定义在函数内部、函数外、prototype上的区别
    • 7.2 class创建实例与构造函数创建实例

首先定义一个父类

function Animal (name, age) {
  this.name = name
  this.age = age
  this.eat = function () {
    console.log('吃', this.name, this.age)
  }
}
Animal.prototype.drink = function () {
  console.log('喝', this.name, this.age)
}

// 实验一下
const test = new Animal('狗', 3)
test.eat()
test.drink()
console.log(test)

运行结果

在这里插入图片描述

1 使用extends实现继承

最简便的继承方式,仅支持ES6+

class Dog extends Animal {
  constructor(name, age, breed) {
    super(name, age)
    this.breed = breed
  }
  cry () {
    console.log('叫', this.name, this.age, this.breed)
  }
}

// 实验一下
  const dog = new Dog('狗', 3, '田园犬');
  dog.eat()
  dog.drink()
  dog.cry()
  console.log(dog)

实验结果

在这里插入图片描述

2 原型链继承

function Dog (name, age, breed) {
  Animal.call(this, name, age);
  this.breed = breed;
  this.cry = function () {
    console.log('叫', this.name, this.age, this.breed)
  }
}
Dog.prototype = new Animal()
Dog.prototype.constructor = Dog

// 实验一下
const dog = new Dog('狗', 3, '田园犬');
console.log(dog)
dog.eat()
dog.drink()
dog.cry()

实验结果

在这里插入图片描述

3 组合继承

function Dog (name, age, breed) {
  Animal.call(this, name, age);
  this.breed = breed;
  this.cry = function () {
    console.log('叫', this.name, this.age, this.breed)
  }
}
Dog.prototype = Object.create(Animal.prototype)
Dog.prototype.constructor = Dog

// 实验一下
const dog = new Dog('狗', 3, '田园犬');
console.log(dog)
dog.eat()
dog.drink()
dog.cry()

实验结果

在这里插入图片描述

4 寄生组合继承

function Dog (name, age, breed) {
  Animal.call(this, name, age);
  this.breed = breed;
  this.cry = function () {
    console.log('叫', this.name, this.age, this.breed)
  }
}
(() => {
  let Super = function () { };
  Super.prototype = Animal.prototype;
  Dog.prototype = new Super();
  Dog.prototype.constructor = Dog;
})();

// 实验一下
const dog = new Dog('狗', 3, '田园犬');
console.log(dog)
dog.eat()
dog.drink()
dog.cry()

实验结果

在这里插入图片描述

5 实例继承

function Dog (name, age, breed) {
  let dog = new Animal(name, age);
  dog.breed = breed;
  dog.cry = function () {
    console.log('叫', this.name, this.age, this.breed)
  }
  return dog
}

// 实验一下
const dog = new Dog('狗', 3, '田园犬');
console.log(dog)
dog.eat()
dog.drink()
dog.cry()

实验结果

在这里插入图片描述

6 拷贝继承

function Dog (name, age, breed) {
  let animal = new Animal(name, age);
  for (let key in animal) {
    this[key] = animal[key]
  }
  this.breed = breed;
  this.cry = function () {
    console.log('叫', this.name, this.age, this.breed)
  }
}

// 实验一下
const dog = new Dog('狗', 3, '田园犬');
console.log(dog)
dog.eat()
dog.drink()
dog.cry()

实验结果

在这里插入图片描述

7 扩展

7.1 函数中方法定义在函数内部、函数外、prototype上的区别

  • 挂载在函数内部的方法,实例内部会复制构造函数的方法
  • 挂载在原型上的方法,不会去复制。
  • 挂载在内部和原型上的方法都是可以通过实例去调用的
  • 一般来说,如果需要访问构造函数内部的私有变量,我们可以定义在函数内部,其他情况我们可以定义在函数的原型上
  • 在函数外定义的方法,只能用类调用
函数位置调用方式结果
构造函数内函数名直接调用报错
函数外函数名直接调用正常执行
函数外 prototype上函数名直接调用报错
构造函数内实例化对象调用正常执行
函数外实例化对象调用报错
函数外 prototype上实例化对象调用正常执行

7.2 class创建实例与构造函数创建实例

function exa1 (name, age) {
    this.name = name
    this.age = age
    this.innerFunc = function () {
      console.log('inner')
    }
  }
  exa1.prototype.outerFunc = function () {
    console.log('prototype')
  }
  exa1.getClassName = function () {
    console.log('example')
  }
  class exa2 {
    constructor(name, age) {
      this.name = name
      this.age = age
    }
    innerFunc = function () {
      console.log('inner')
    }
    outerFunc () {
      console.log('prototype')
    }
    static getClassName () {
      console.log('example')
    }
  }
  console.log(new exa1(), new exa2())

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/485793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java Web案例:实现用户登录功能

文章目录 零、本节学习目标一、纯JSP方式实现用户登录功能(一)实现思路(二)实现步骤1、创建Web项目2、创建登录页面3、创建登录处理页面4、创建登录成功页面5、创建登录失败页面6、编辑项目首页 (三)测试结…

【JavaEE】CSS基础知识

文章目录 1.CSS概念1.1CSS是干啥的?1.2基础语法规范1.2基础语法规范1.3引入格式✨内部样式表✨行内样式表✨外部样式(最常用的样式) 1.4代码风格✨样式格式✨样式大小写 2.选择器2.1选择器的功能2.2基础选择器有哪些?&#x1f6e0…

GPT 告诉你请求到达 Tomcat 是怎么处理的

tomcat如何监听请求到达 没有SpringMVC,tomcat 如何处理请求 Tomcat 线程池的作用是什么 如何配置tomcat 线程池 tomcat 线程池的主要任务是处理连接请求 tomcat线程池是怎么实现的 到这里可以看出来,tomcat线程池的实现方式也是通过ThreadPoolExecutor 实现 如何根…

Git 使用教程整理

一、配置Git 编码为utf-8 设置登陆账号 使用Git GUI操作 二、获取远程仓库代码 推荐使用使用 git bash 命令:git clone xxx git clone https://github.com/jeromeetienne/jquery-qrcode.git 其他参考:使用Git获取最新版本到本地_gitgui 获取新版本_天…

【Java开发】Spring Cloud 11 :Gateway 配置 ssl 证书(https、http 访问)

最近研究给微服务项目配置 ssl 证书,如此才可以对接微信小程序(需要使用 https 请求)。传统单体项目来说,首先往项目中添加证书文件,然后在配置文件中配置 ssl 证书路径、密码等相关信息;那么微服务这么多项…

高性能定时器--时间轮/多级时间轮

运行原理 指针指向轮子上的一个槽,轮子以恒定的速度顺时针转动,每转动一步就指向下一个槽(虚线指针指向的槽),每次转动称为一个tick,一个tick的时间称为时间轮的槽间隔slot interval,即心搏时间…

3。数据结构(2)

嵌入式软件开发第三部分,各类常用的数据结构及扩展,良好的数据结构选择是保证程序稳定运行的关键,(1)部分包括数组,链表,栈,队列。(2)部分包括树,…

JavaWeb_Web前端_Element组件库

JavaWeb_Web前端_Element组件库 快速入门安装ElementUI组件库引入ElementUI组件库添加组件并导入到根组件添加组件导入到根组件 Table 表格Pagination 分页Dialog对话框表单 案例Vue路由Vue类DeptView.vue动态视图组件请求链接组件 打包和部署打包打包按钮打包文件 部署部署静态…

OpenAI文本生成器-OpenAI文本生成器

openai自动批量写文章 如果您正在寻找一个能够自动生成高质量文章的工具,OpenAI 写文章就是您需要的推广神器。 OpenAI 写文章基于 OpenAI 最先进的语言模型技术,可以使用自然语言生成技术自动创作文章。只需在平台上提供少量的关键词或概念&#xff0…

Python每日一练:最长递增区间狄杰斯特拉(80分)K树(0分)

文章目录 前言一、最长递增区间二、狄杰斯特拉(80)三、K树(0)总结 前言 很显然,Python的受众远远大于C,其实笔者本人对Python的理解也是远强于C的,C纯粹是为了假装笔者是个职业选手才随便玩玩的…

java基础入门-04

Java基础入门-04 11、集合&学生管理系统11.1.ArrayList集合和数组的优势对比:11.1.1 ArrayList类概述11.1.2 ArrayList类常用方法11.1.2.1 构造方法11.1.2.2 成员方法11.1.2.3 示例代码 11.1.3 ArrayList存储字符串并遍历11.1.3.1 案例需求11.1.3.2 代码实现 11…

基于野火F407骄阳开发板的苹果采摘机器人机械臂的采摘轨迹与夹持器的采摘动作的设计(1)

基于野火F407骄阳开发板的苹果采摘机器人机械臂的采摘轨迹与夹持器的采摘动作的设计(1) 苹果采摘机器人1、采摘流程与硬件设计2、机械臂驱动以及采摘轨迹设计2.1、台达A2电机驱动实现2.2、机械臂寻找苹果巡逻轨迹 苹果采摘机器人 1、采摘流程与硬件设计…

fio 使用碰到的坑,一些不常用,但可能用到的参数(校验 跳跃 多线程)

1, 祼盘读写 一个分区 -filename/dev/sdb1 同时测试多个分区 -filename/dev/sdb1;/dev/sdb2 比例: fio -filename/dev/sdb1 -direct1 -iodepth 1 -thread -rwrandread -ioenginepsync -bs4k -size50G -numjobs10 -runtime1000 -group_reporting -nam…

es6的语法糖,展开运算符,类的实现

1.0 ES6语法糖 [重点] 1.1数组的解构赋值 // 声明多个变量 let [a,b,c] [1,2,3] ​ let a1,b2; // 交换数值 [a,b] [b,a] ​2 1.12 函数的参数结构 1.2对象的解构 对象存在键值对,如果需要解构对象,你需要使用对象的键名为变量…

Flask 知识点整理

文章目录 1.URL与视图的映射带参数的url:将参数固定到了path中查询字符串的方式传参 2.模板渲染给html文件传参 3.模板访问对象属性User 是个类User是个字典 4.过滤器的使用通过一个 | 管道符进行过滤自定义过滤器 5.控制语句iffor 1.URL与视图的映射 带参数的url&…

IIC总线简介

IIC总线 IIC总线是Philips公司在八十年代初推出的一种串行、半双工总线 主要用于近距离、低速的芯片之间的通信;IIC总线有两根双向的信号线一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步;IIC总线硬件结构简单,成…

第9章 项目成本管理

文章目录 9.1.1 成本与成本管理概念 329项目成本管理的过程 9.1.2 相关术语 331成本的类型(6种)应急储备与管理储备 9.2.3 项目成本管理计划制订的 输出 3349.3.1 项目成本估算的主要相关因素 335项目估算还需要考虑但 容易被忽视的 主要因素 9.3.2 项目…

贪心 题目集

任务安排问题 某个系统中有一个设备,该设备每次只能分配给一个任务使用,且只有当任务结束后才能再分配给另一个任务使用。 假设系统启动时间计为时间0点,预先有一份任务计划表,预定了每个任务的开始时间点和持续时间。 要求设计算…

[大二下]手把手1小时下载Pandoc

老规矩先给各位友友们提供参考解决方法,再说为啥是怎么和这哥们结缘的~ 为了能更加详细,小卓又卸载了重装了一遍!!! 所以麻烦各位佬, 能给个赞, 谢谢各位佬了,坦诚的说,因为友友们免费的点赞收藏,却是我写下去的动力~ 第一步:进入官网(如果没有科学上网的可能比较慢, 如果真的…

腾讯云 Ubuntu Desktop 22.04 桌面版

安装 Ubuntu Server 22.04 安装 Ubuntu Server 22.04重置登陆密码, 默认用户名 ubuntu 添加用户 不建议直接使用默认用户, 添加用户(demodeom) sudo adduser demodeom将 demodeom 添加到 sudoer 文件 sudo visudo在文件末尾添…