JS-04何为继承以及实现方式
目录
1 JS中继承的概念
2 为什么要使用继承?-解决内存浪费
2.1 问题引入
2.2 问题解决
2.3 拓展
3 继承的实现方式
3.1 原型链继承 1
3.2 原型链继承 2
1 JS中继承的概念
通过【某种方式】让一个对象可以访问到另一个对象中的属性和方法,我们把这种方式称之为继承 `并不是所谓的xxx extends yyy`
2 为什么要使用继承?-解决内存浪费
2.1 问题引入
有些对象会有方法(动作、行为),而这些方法都是函数,如果把这些方法和函数都放在构造函数中声明就会导致内存的浪费🍂
function Person(){this.say=function(){console.log("你好")}}var p1=new Person();var p2=new Person();console.log(p1.say === p2.say); //false
现象:两个实例的say方法不相等,控制台输出为false
结论:若将方法放入构造函数中,则当每创建一个实例时就会再次创建结构相似的方法。这两个方法不是同一个。所以会造成内存的浪费
2.2 问题解决
🍃解决方案:把say方法写在他们共同的(父对象)中
function Person(name,age){this.name=name;this.age=age;this.say=function(){}}var p1=new Person();var p2=new Person();//p1对象和p2对象的say方法是否是同一个方法:falseconsole.log(p1.say===p2.say);//由于say方法可能功能相似,但是不是同一个方法(没有指向同一块内存,会造成内存浪费)//解决方案:把say方法写在他们共同的(父对象)中//其实他们共同的父对象,就可以通过:Person.prototype来获取//-->只要把say方法写在Person.prototype中,那么say方法就是同一个方法Person.prototype.run=function(){console.log('时速555KM');}//此时p1和p2都可以访问到run方法p1.run();p2.run();//验证p1.run和p2.run是否是同一个方法?console.log(p1.run == p2.run); //指向同一个方法,这种方法避免了内存的浪费console.log(p1.run == Person.prototype.run);//truevar p3=new Person();console.log(p3.run == p1.run); //trueconsole.log(p3.run === p1.run);//true
🌸结论:只要往某个构造函数的prototype对象中添加某个属性、方法,那么这样的属性、方法都可以被所有的构造函数的实例所共享
==>这里的【构造函数的prototype对象】称之为原型对象
Person.prototype是 p1 p2 p3 的原型对象
Person.prototype是Person构造函数的【实例】的原型对象
2.3 拓展
猜猜看?
Person的原型对象是谁呢?
- 首先要知道Person的构造函数:Function
- 所以Person的原型对象是:Function.prototype
p1的原型对象是谁呢?
- 首先要知道p1是谁创建的? Person
- 所以p1的原型对象时: Person.prototype
3 继承的实现方式
3.1 原型链继承 1
代码片实现,如下:
<script>function Dog(){}var d1=new Dog();//为了让d1有一个叫的方法,//不行:d1.say=function(){}//正确:在原型中添加方法Dog.prototype.say=function(){console.log('汪汪汪');} </script>
🍂缺点:添加1、2个方法无所谓,但是如果方法很多会导致过多的代码冗余。代码片如下:
function Cat(name){this.name=name;}var tom=new Cat("汤姆");//实例//目的:把say方法放在tom的原型对象中(Cat.prototype)Cat.prototype.say=function(){}//问题:Cat.prototype.s1=function(){}Cat.prototype.s2=function(){}Cat.prototype.s3=function(){}Cat.prototype.s4=function(){}Cat.prototype.s5=function(){}//通过上面的方式,给tom的原型对象添加了好多方法,也就是让tom拥有了好多方法,但是代码产生了不少的冗余(重复)
3.2 原型链继承 2
🍃解决上面问题代码冗余问题,改良版思路:
//-->为了减少这种重复,改良版:Cat.prototype = {a1:function(){},a2:function(){},a3:function(){},a4:function(){},a5:function(){}}console.log(tom.s1); //可以访问console.log(tom.a1); //undefined
原因:tom对象在创建的时候已经有了一个确定的原型对象,就是旧的Cat.prototype由于Cat.prototype后面被重新赋值,但是tom对象的原型对象却没有改变,所以tom对象并不能访问到新原型对象中的a1-a5方法
如何解决这个问题?
-->先改变原型、再创建对象🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
Person.prototype={constructor:Person,say:function(){console.log("你好");},run:function(){console.log("正在进行running");}}
+ 注意点:
+ a、一般情况下,应该先改变原型对象,再创建对象
+ b、一般情况下,对于新原型,会添加一个constructor属性,从而不破坏原有的原型对象的结构<script>function Tiger(){}Tiger.prototype={a:function(){},b:function(){}}//创建tiger实例,此时的tiger实例的原型对象是新原型,所以tiger可以访问到新原型中的属性和方法(a/b)var tiger=new Tiger();console.log(tiger.a);console.log(tiger.b); </script>
🐶其他继承实现方式(拷贝继承、原型式继承、借用构造函数实现继承),后续将会继续发布分享,敬请期待!!
相关文章:
JS-04何为继承以及实现方式
目录 1 JS中继承的概念 2 为什么要使用继承?-解决内存浪费 2.1 问题引入 2.2 问题解决 2.3 拓展 3 继承的实现方式 3.1 原型链继承 1 3.2 原型链继承 2 1 JS中继承的概念 通过【某种方式】让一个对象可以访问到另一个对象中的属性和方法,我们把这种…...

6款网站登录页(附带源码)
6款网站登录页 效果图及部分源码123456 领取源码下期更新预报 效果图及部分源码 1 部分源码 <style>* {margin: 0;padding: 0;}html {height: 100%;}body {height: 100%;}.container {height: 100%;background-image: linear-gradient(to right, #fbc2eb, #a6c1ee);}.l…...

spring boot打的包直接运行
Spring Boot 提供了一个插件 spring-boot-maven-plugin 把程序打包成一个可执行的jar包,直接执行java -jar xxx.jar即可以启动程序 1、引用 spring-boot-maven-plugin插件 <build><plugins><plugin><groupId>org.springframework.boot<…...
移除元素-力扣
第一种解法,暴力解法,使用两个for循环一个进行遍历,一个进行覆盖,代码如下: class Solution { public:int removeElement(vector<int>& nums, int val) {int size nums.size();for(int i 0; i < size; …...

代码随想录算法训练营第三天| 203.移除链表元素、 707.设计链表、 206.反转链表
203.移除链表元素 题目链接: 203.移除链表元素 文档讲解:代码随想录 状态:没做出来,做题的时候定义了一个cur指针跳过了目标val遍历了一遍链表,实际上并没有删除该删的节点。 错误代码: public ListNode re…...

【题解】AB33 相差不超过k的最多数(排序 + 滑动窗口)
https://www.nowcoder.com/practice/562630ca90ac40ce89443c91060574c6?tpId308&tqId40490&ru/exam/oj 排序 滑动窗口 #include <iostream> #include <vector> #include <algorithm> using namespace std;int main() {int n, k;cin >> n &…...

LSPatch免root手机模块应用
软件介绍 LSPatch是一款免root手机模块应用,兼容大部分机型,使用LSPatch,您可以个性化您的Android设备,添加新的功能,修改系统设置,甚至完全改变系统的外观。您可以根据自己的需求选择和安装各种Xposed模块…...

深入解析kube-scheduler的算法自定义插件
目录 编辑 一、问题引入 二、自定义步骤 三、最佳实践考虑 一、问题引入 当涉及到 Kubernetes 集群的调度和资源分配时,kube-scheduler 是一个关键组件。kube-scheduler 负责根据集群的调度策略,将 Pod 分配到适当的节点上。kube-scheduler 默认使…...
java原型模式 (Prototype Pattern) 介绍
原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有的实例来创建新对象,而不是通过实例化类来创建对象。这个模式允许你创建对象时避免复杂的初始化步骤,并且能够动态地创建对象的副本。 原型模式的关键…...

LLama3 | 一. 本地 Web Demo 部署
前置工作 课程文档:Llama3-Tutorial/docs/hello_world.md at main SmartFlowAI/Llama3-Tutorial GitHub 1.安装vscode 2.安装vscode插件 Remote SSH 3.配置 VSCode 远程连接开发机 ssh连接开发机 进行端口映射 在开发机控制台中点击自定义服务,复…...

MariaDB 给指定列值自动加密(持久数据加触发器)
文章目录 代码插入时,自动加密更新时,自动加密查看触发器数据操作示例update数据取出解密取 注意一次尝试,看加密后数据长度 参考链接: 一篇非常好的讲解触发器的文章:示例、原理MySQL/MariaDB触发器。 用触发器自动加…...
深入理解Linux系统管理与网络配置高级指南
深入理解Linux系统管理与网络配置高级指南 目录 深入理解Linux系统管理与网络配置高级指南 一、Linux文件系统管理 二、Linux进程管理 三、Linux系统管理 四、Linux网络管理 五、Linux磁盘管理 一、Linux文件系统管理 1.1 文件和目录操作 在Linux中,一切皆…...

朴素贝叶斯+SMSSpamCollections
1. 打开 Jupyter 后,在工作目录中,新建一个文件夹命名为 Test01 ,并且在文件夹中导入数据 集。在网页端界面点击 “upload” 按钮,在弹出的界面中选择要导入的数据集。然后数据集出现 在 jupyter 文件目录中,此时…...

【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
文章目录 一、前言二、绘制效果三、ConstraintLayout 使用方法3.1 创建布局文件3.2 替换配置3.3 设置约束,步骤13.4 设置约束,步骤23.5 其他设置 四、结束 一、前言 在进行Android APP开发过程中,减少layout嵌套即可改善UI的绘制性能&#x…...
深度神经网络详解
深度神经网络详解 一、引言二、深度神经网络的基本概念1. 什么是神经网络2. 深度神经网络的定义3. 基本结构4. 激活函数 三、深度神经网络的发展历史1. 初期发展2. 反向传播算法的提出3. 深度学习的崛起 四、深度神经网络的架构1. 前馈神经网络(Feedforward Neural …...
MYSQL 数据迁移利器 MYSQLSH
1 迁移背景 将数据库从mysql5.7 迁移到mysql8.0. mysqlsh 支持mysql5.7以上版本。 2 查看数据量 SELECT TABLE_SCHEMA, round(SUM(data_length+index_length)/1024/1024,2) AS TOTAL_MB, round(SUM(data_length)/1024/1024,2) AS DATA_MB, …...

【MYSQL】分数排名
表: Scores ---------------------- | Column Name | Type | ---------------------- | id | int | | score | decimal | ---------------------- id 是该表的主键(有不同值的列)。 该表的每一行都包含了一场比赛的分数。Score 是…...

【论文笔记】| 蛋白质大模型ProLLaMA
【论文笔记】| 蛋白质大模型ProLLaMA ProLLaMA: A Protein Large Language Model for Multi-Task Protein Language Processing Peking University Theme: Domain Specific LLM Main work: 当前 ProLLM 的固有局限性:(i)缺乏自然…...

MySQL笔记第一天(从小白到入门)
文章目录 MySQL笔记SQL语言介绍数据库系统关系型数据库非关系型数据库SQL和数据库系统的关系数据库系统架构 MySQL的介绍概念MySQL的版本 MySQL的DDL操作-重点基本数据库操作基本表操作 MySQL的DML操作-重点insert-插入数据update-更新数据delete-删除数据 MySQL的约束-了解概述…...

初识Qt:从Hello world到对象树的深度解析
Qt中的对象树深度解析 Hello world1.图形化界面创建命令行式创建在栈上创建在堆上创建为什么传文本需要QString,std::string不行吗?那为什么要传入this指针?为什么new后不用显示调用delete函数呢,不会造成内存泄漏问题吗ÿ…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...