javascript中的继承方式

JavaScript 中的五种继承方式进行深入对比 本文详细对比了JavaScript中的五种继承方式:原型链继承、构造函数继承、组合继承、寄生组合继承以及ES6的class extends继承。每种方式的核心原理、示例代码、优缺点及应用场景均进行了深入分析。原型链继承通过子类原型指向父类实例实现继承,简单但存在引用属性共享问题;构造函数继承通过在子类构造函数内调用父类构造函数实现属性继承,但无法继承方法;组合继承结合了前两种方式的优点,既继承属性又继承方法;寄生组合继承进一步优化组合继承,减少父类构造函数调用次数;ES6的class extends继承语法 阅读详情
  • 让一个构造函数去继承另一个构造函数的属性和方法
  • 继承是发生在两个构造函数之间
  • 是与构造函数相关的应用

1.原型对象(prototype)继承

  • 优点:简单,方便,易操作
  • 缺点:
    • 不能继承构造函数里的属性和方法
    • 只能继承原型对象身上的属性和方法
function Parent(){
	this.name = "admin";
	this.sayHi = function(){
		console.log("hi");
	}
}
Parent.prototype.show = function(){
	console.log("Parent的方法");
}

function Child(){}

//原型对象继承:深拷贝
for(var i in Parent.prototype){
	Child.prototype[i] = Parent.prototype[i];
}

var p = new Parent();
console.log(p.name);    //admin
p.sayHi();			    //hi
p.show();		    	//Parent的方法

var c = new Child();
console.log(c.name);    //undefined
//c.sayHi();	    	//报错:c.sayHi is not a function
c.show();		    	//Parent的方法


Child.prototype.show = function(){
	console.log("Child自己写的方法");
}
//不会覆盖Parent实例的方法
c.show();		    	//Child自己写的方法

2.原型链(__proto__)继承

  • 优点:
    • 更加的简单,方便,易操作
    • 可以继承构造函数中的方法和属性
    • 可以继承原型身上的方法和属性
  • 缺点:不方便传参
function Parent(a){
	this.name = "admin";
	this.sayHi = function(){
		console.log("hi");
	};
	this.age = a;
}
Parent.prototype.show = function(){
    console.log("Parent的方法");
	console.log(this.age);
}

function Child(){}

var p = new Parent("18");
console.log(p.name);    //admin
p.sayHi();	            //hi
p.show();	            //Parent的方法  18

//原型链继承
Child.prototype = new Parent();
//Child实例c ---> __proto__ ---> Child.prototype ---> Parent的实例 ---> __proto__ ---> Parent.prototype

var c = new Child();
console.log(c.name);    //admin
c.sayHi();	            //hi
c.show();	            //Parent的方法   undefined

Child.prototype.show = function(){
	console.log("Child自己写的方法");
}
//不会覆盖Parent实例的方法
c.show();			//Child自己写的方法

构造函数继承

  • 优点:
    • 方便传参
    • 可以实现多继承
  • 缺点:
    • 只能继承构造函数内部的属性或方法,
    • 不能继承原型身上的属性或方法
function Parent(s){
	this.skill = s;
	this.sayHi = function(){
		console.log("hi");
	};
}
Parent.prototype.show = function(){
	console.log("parent的方法");
}

function Child(n){
	//构造函数继承:改变this指向
	Parent.call(this,n);
}

var p = new Parent("正式工");
console.log(p.skill);	//正式工
p.sayHi();				//hi
p.show();				//parent的方法

var c = new Child("实习工");
console.log(c.skill);	//实习工
c.sayHi();				//hi
//c.show();				//报错:c.show is not a function

混合继承(构造函数继承 + 原型对象继承)

  • 优点
    • 方便传参
    • 可以实现多继承构造函数
    • 可以继承构造函数中的方法和属性
    • 可以继承原型身上的方法和属性
  • 缺点:
    • 略复杂
    • 原型链继承时,传参时有隐患
function Parent(s){
	this.skill = s;
	this.sayHi = function(){
		console.log("hi");
	};
	//测试原型链继承时,参数隐患,报错:Cannot read property 'split' of undefined
	//测试原型对象继承时,不报错。
	this.skill.split();
}
Parent.prototype.show = function(){
	console.log("parent的方法");
}

function Child(s){
	//构造函数继承
	Parent.call(this,s);
}

//原型对象继承:没有传参隐患
for(var i in Parent.prototype){
	Child.prototype[i] = Parent.prototype[i];
}

//原型链继承:有传参隐患
//Child.prototype = new Parent();

var p = new Parent("正式工");
console.log(p.skill);	//正式工
p.sayHi();				//hi
p.show();				//parent的方法

var c = new Child("实习工");
console.log(c.skill);	//实习工
c.sayHi();				//hi
c.show();				//parent的方法

Child.prototype.show = function(){
	console.log("Child自己写的方法");
}
//不会覆盖Parent实例的方法
c.show();				//Child自己写的方法

ES6的class继承(构造函数继承 + 原型链继承)

  • 优点:
    • 方便传参
    • 可以继承构造函数中的方法和属性
    • 可以继承原型身上的方法和属性
  • 关键字:
    • extends
    • super
class Parent{
	constructor(s){
		this.skill = s;
		this.name = "admin";
	}
	show(){
		console.log("parent的方法");
	}
}

class Child extends Parent{
	constructor(s){
		super(s);   //改变this指向和传参的作用
		this.skill = s;
		this.name = "anran";
	}
	show(){
		console.log("Child自己写的方法");
	}
}

var p = new Parent("正式工");
console.log(p.skill);       //正式工
console.log(p.name);        //admin
p.show();			        //parent的方法

var c = new Child("实习工");
console.log(c.skill);       //实习工hello
//不会覆盖Parent实例的属性和方法
console.log(c.name);        //anran
c.show();			        //Child自己写的方法

总结比较

~原型对象继承原型链继承构造函数继承混合继承(构造函数继承+原型对象继承)ES6class继承(构造函数继承+原型链继承)
优点简单方便易操作1.更加简单方便易操作,2.可以继承构造函数中的方法和属性,3.可以继承原型身上的方法和属性1.方便传参,2.可以实现多继承1.方便传参,2.可以实现多继承,3.可以继承构造函数中的方法和属性,4.可以继承原型身上的方法和属性1.方便传参,2.可以实现多继承,3.可以继承构造函数中的方法和属性,4.可以继承原型身上的方法和属性
缺点1.不能继承构造函数中的方法和属性,2.只能继承原型身上的方法和属性不方便传参1.只能继承构造函数中的方法和属性,2.不能继承原型身上的方法和属性1.略复杂,2.原型链继承时依然有参数隐患无
BBR算法原理与实现深度解析 BBR算法通过重新定义拥塞控制的基本范式,为现代网络应用提供了突破性的解决方案。随着QUIC协议的普及和智能网卡技术的发展,BBR类算法将在边缘计算、云游戏、工业物联网等领域发挥更重要的作用。 阅读详情

相关推荐

手把手教你用键盘在Ubuntu上给Lerobot机械臂采集HIL-SERL训练数据(附完整配置文件)

本文详细介绍了在Ubuntu系统中使用键盘控制Lerobot机械臂进行HIL-SERL训练数据采集的完整流程。从环境准备、机械臂校准到键盘遥操系统配置和数据采集优化,提供了实战指南和常见问题解决方案,帮助读者高效获取高质量训练数据,推动具身智能和强化学习应用的发展。

weixin_30733003的博客 477

js 实现继承的12种方法

1. 原型链 基于构造器工作的模式 js 默认的继承机制 Child.prototype = new Parent(); 将方法与属性集中可复用的部分迁移到原型链中,而将不可复用的部分设置为对象自身的属性 2. 仅从原型继承 基于构造器工作的模式 Child.prototype = Parent. prototype; 不存在原型链,所有的对象共享一个原型对象 优点 由于该模式在构建继承关系时不需要新建对象实例,效率上会有较好的表现 原型链上的查询也会比较快,因为这里根本不存在链 缺点 对子.

朝阳39的博客 4195

零基础玩转STM32CubeIDE LL库:5分钟搞定串口通信(附完整代码)

本文为零基础开发者提供了一份STM32CubeIDE LL库串口通信的快速实战指南。通过CubeMX配置、LL库核心API详解,以及中断接收与环形缓冲区的完整代码实现,帮助读者在5分钟内搭建稳定可靠的串口收发框架,解决从HAL切换到LL库的常见困惑,提升嵌入式开发效率。

weixin_29159441的博客 306

javaScript 中的混合继承

子类既继承了父类this中的属性,又继承了父类原型中的属性 子类实例对象既是 父类 的实例,又是 子类 的实例 function Parent(name, age) { this.name = name; this.age = age; } Parent.prototype.say=function(){ //给父级原型上添加一个方法 console.log(this.name);

weixin_55741908的博客 481

maxwell与steady state thermal 通过workbench耦合仿真

文章目录maxwellsteady state thermal maxwell 1加入maxwell并打开 2导入模型 3选择求解器类型:涡流求解器eddy current 4修改模型名字不能带_等特殊符号 5为模型赋材料 6设立3D边界,各边电流进出方向为0其余方向300 7设置激励条件,可设置电流大小,相位,方向 8设置集肤深度,选取中间铜导体的体然后设置,如何设置看帮助文档 9求解设置 迭代步数 收敛精度 交流电频率 10验证条件满足计算 11求解 发现无法求解,删除ai

roymustang的博客 9199

从FedAvg到实战:手把手教你用PyTorch复现联邦学习经典论文实验(MNIST/CIFAR-10)

本文详细介绍了如何使用PyTorch复现联邦学习经典算法FedAvg在MNIST和CIFAR-10数据集上的实验。从环境搭建、数据非IID划分到模型实现和参数聚合,手把手教你掌握联邦学习的核心技术与实战技巧,帮助开发者和研究人员快速实现隐私保护的分布式机器学习方案。

weixin_29053695的博客 252

JS中的三种继承方式(原型链继承、冒充继承、混合继承)

//创建一个人类 function People(name,age,sex,country){ this.name=name; this.age=age; this.sex=sex; this.country=country; } People.prototype.eat=functio...

zhengjingID的博客 437

微信小程序内容安全审核:从API调用到工程化落地的全流程实践

内容安全是互联网应用开发中的基础性技术环节,尤其在用户生成内容(UGC)场景下,它直接关系到平台的合规性与用户体验。其核心原理通常结合了关键词过滤、自然语言处理(NLP)和计算机视觉(CV)等技术,通过AI模型对文本、图像、音频进行多维度风险识别。这项技术的价值在于,它不仅是满足监管要求的必要手段,更是构建健康社区生态、保护品牌声誉、实现产品长期稳定运营的基石,广泛应用于社交、电商、社区论坛等各类UGC平台。本文聚焦于微信小程序生态,深入剖析其官方提供的内容安全解决方案,详细解读如何将文本同步检测与多媒体异

weixin_28622215的博客 451

JS 混合继承

<script type="text/javascript"> window.onload=function(){ //混合继承:原型实现继承+借用构造函数继承 function Person(name,age,gender,wight){ this.name=name; this.age=age; this.gender=gender; this.wight=wight; ...

jifubu6013的博客 1633

东方财富API隐藏技巧:这样获取分时均价线数据更稳定(避坑指南)

本文深入解析东方财富API获取股票分时数据,特别是分时均价线的实战技巧与避坑指南。针对高频调用中常见的请求失败、数据错位及IP限制等问题,提供了从接口参数深层解析、稳健请求与错误处理机制,到系统优化与数据校验的全流程解决方案,帮助开发者构建稳定可靠的数据采集系统。

rice5的博客 2522

YOLOv11改进 | 注意力篇 | YOLOv11引入24年ECCV的自调制特征聚合注意力模块(SMFA),并构建C2PSA_SMFA

1.SMFA介绍1.1 摘要:基于Transformer的图像复原方法由于Transformer的自注意(self-attention,SA)特性能够更好地挖掘非局部信息,从而获得更好的高分辨率图像重建效果,因此具有重要的应用价值。然而,关键点积SA需要大量的计算资源,这限制了其在低功耗器件中的应用。此外,模拟退火机制的低通特性限制了其捕获局部细节的能力,从而导致平滑的重建结果。

tsg6698的博客 952

Javascript中的混合继承

混合继承 既继承模板 也继承原型对象 为了解决原型继承和类继承中的不足,我们可以使用他们两种的混个继承 //父类 function Father(name,age){ this.name = name; this.age = age; } //父类的原型对

社会人 1382

【GameFramework框架内置模块】9、有限状态机(FSM)

这篇文章分享FSM有限状态机,了解过StarForce源码的同学相比都比较了解,GameFramework框架给我们抽象了一个Procedure流程的概念。这个Procedure流程可以方便的处理我们游戏从启动到游戏的各个流程阶段的处理逻辑,实现的核心就是FSM状态机,内部的Procedure流程就是不同的FsmState状态。接下来,就是FSM有限状态机的教程了。有限状态机(Finite-state machine,FSM)

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2532

[JavaScript]js有哪些继承方式

js继承的方法 想要继承,就必须先提供一个父类,这里以Person来作为父类举例 function Person(name){//给构造函数添加了参数 this.name=name; this.sex="male"; this.say=function(){ console.log(this.name); } } Person.pr

DaftJayee的博客 501

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Js如何实现继承(js实现继承的五种方式)

js继承有5种实现方式: 1、继承第一种方式:对象冒充 function Parent(username){ this.username = username; this.hello = function(){ alert(this.username); } } function Child(username,password){ //通过以...

It_sharp的博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

javascript继承、js继承实现方式、js继承优缺点

有如下父类 function People(name,age){ this.name = name this.age = age this.seelp = function(){ console.log('i am seelp') } } People.prototype.eat = function(){ console.log('i can eat') } 原型链继承 原理: 子类 的 prototype = 父类 的 实例 优点: 简单 不占

xiao_yu_liu的博客 266

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

js之三种继承方式

我要成为这次疫情期间,最闲得码农!!!! 一、为什么要有JS继承 假如每一个实例对象,都要有自己的属性和方法的副本。这不仅无法做到数据共享,也是极大的资源浪费。(这就和我们现实中会继承父母的资产一样,你是可以选择不继承的,但是浪费钱啊) 二、JS继承的三种方式 1.原型继承 //构建一个父类 function Person(name) {...

weixin_44395929的博客 501

JavaScript 继承 | 我学到的JS五种继承方式

文章目录1. 构造继承1.1 构造继承的优点1.2 构造继承的缺点2. 原型继承2.1 原型链继承的优点2.2 原型链继承的缺点3. 复制继承3.1 复制继承的优点3.2 复制继承的缺点4. 组合继承4.1 组合继承的优点4.2 组合继承的缺点5. 寄生组合继承(完美级)5.1 寄生组合继承的优点5.2 寄生组合继承的缺点6 学习小结 1. 构造继承 核心思想:在子类的构造函数中通过call()函数或apply()函数改变this的指向,调用父类的构造函数,实现继承效果 // 示例代码 // 父类 f

是希望的博客 215

【JS】JavaScript中的六种继承方式总结

前言 对于JS中的继承,一直都是不完全理解那种,最近找实习,面试中几乎必问JS的继承,故今天特地来整理下JS中的几种继承方式。 JS实现继承的几种方式 在说继承方式之前,我们先来定义下父类的代码以及一些约定的说法: // 定义一个动物类,这是父类 function Animal (name) { //私有属性,用不到,所以这里注释了 //var name = 'Anim...

胡小小六的博客 546

【JavaScript】理解JS中的各种继承方式(寄生式组合继承)

理解JavaScript中的各种继承方式,包括:组合继承、原型式继承、寄生式继承、寄生式组合继承。

qq_47246331的博客 709

js(javascript)实现继承的6种方式以及优缺点详解

js继承的6种方式 想要继承,就必须要提供个父类(继承谁,提供继承的属性)      一、原型链继承      重点:让新实例的原型等于父类的实例。     特点:1、实例可继承的属性有:实例的构造函数的属性,父类构造函数属性,父类原型的属性。(新实例不会继承父类实例的属性!)     缺点:1、新实例无法向父类构造函数传参。        2、继承单一。        3、所有新实例都会共享父类实例的属性。(原型上的属性是共享的,一个实例修改了原型属性,另一个实例的原型属性也会被修改!)      二、

m0_53592673的博客 2205

JS 常见的 6 种继承方式

探究 JS 常见的 6 种继承方式 第一种:原型链继承 原型链继承是比较常见的继承方式之一,其中涉及的构造函数、原型和实例,三者之间存在着一定的关系,即每一个构造函数都有一个原型对象,原型对象又包含一个指向构造函数的指针,而实例则包含一个原型对象的指针。 function Parent1() { this.name = 'parent1' this.play = [1, 2, 3] } function Child1() { this.type = 'child1' } Child1.pro

💻 Code:TypeScript / Engineering 🤖 AI:Prompt Optimization / Context Memory / Coding Agents 5871

JavaScript继承的多种实现方式详解

在JavaScript中,继承是面向对象编程的重要概念之一。通过继承,我们可以让一个对象获得另一个对象的属性和方法,从而实现代码复用。在《JavaScript高级程序设计(第三版)》第6.3节中,详细介绍了JavaScript中实现继承的多种方式。

wenyang12的博客 837

js/javascript 继承方式主要有哪些?及其优缺点特点

大家先看看这之前这篇文章,牢记一些概念。 链接: 构造函数,原型,实例的关系,原型链是什么. // 1.原型链继承 // 先看个小栗子 function F(){ } let s = new F() Object.prototype.x = 1 console.log(s.x) // 1 通过原型链获得的x值 s.x = 2 console.log(s.x) // 2 自己的x值 /* // 以上是原型搜索机制,当以读取模式访问一个实例属性时, // 先再实例搜索这个属性,如果没有会继续搜索原型 //

kyyius的博客 698

JavaScript中的几种继承方式及优缺点

继承也是前端里面的重要的一个知识点,在实际工作中或者面试中也会经常的遇到,那么通过这篇文章我们详细的了解一下继承的几种方式以及各种继承方式的优缺点! 在《JavaScript高级程序设计》一书中主要介绍了6种继承方式以及他们的优缺点,这6种分别为原型链继承、借用构造函数继承、组合继承、原型式继承、寄生式继承以及寄生组合式继承。本文除了介绍这6种继承方式外,还会介绍ES6中的class类继承

幽幽谷 1236

js继承的实现方式

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

weixin_43422530的博客 170
上一篇: js中创建对象的几种方式
下一篇: HTML5新增内容
碎花米饭
博客等级 码龄7年 25粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值