JS继承超详细解析

JS继承JS继承之构造函数继承 一、构造函数js中定义一个function,当使用new关键字调用这个function的时候,这个function成为一个构造函数。如下所示: 二、new关键字当使用new关键字调用构造函数生成一个对象实例时,js做出的关键处理如下: 1.创建一个新的对象,将构造函数内this指针指向新建对象。 2.将新建对象的__proto__属性设置成构造函数的prototype属性,确保新建对象是构造函数实例。 3.运行一遍构造函数,如果构造函数本身需要返回一个object或者array对象,则舍去新创建对象 阅读详情

1、继承的三种方式:

原型链继承、经典继承、组合继承

2、js如何实现继承?

继承是面向对象编程中讨论最多的话题。很多面向对象语言都支持两种继承:接口继承和实现继承。前者只继承方法签名,后者继承实际的方法。接口继承在 ECMAScript 中是不可能的,因为函数没有签名。实现继承是 ECMAScript 唯一支持的继承方式,而这主要是通过原型链实现的。

3、总结

原型链继承:Dog.prototype=new Animal()

经典继承:Animal.call(this)

组合继承:方法Dog.prototype=new Animal() 、属性Animal.call(this)

一、原型链

1、原型链继承

定义:由多个原型对象(xx.prototype)连起来的原型关系链

语法:Dog继承Animal()

Dog.prototype = new Animal()

继承原理:

  • 每个构造函数都有一个原型对象,原型有一个属性指回构造函数,而实例有一个内部指针指向原型。 (图解如下:)

  • 将父的构造函数赋值给子原型对象,子原型对象就会成为父构造函数的实例,此时就会产生_proto_指针,指向父原型对象,这样子原型对象就继承了父原型对象中的方法(父构造函数上面还有一个Object)。图解如下:

例子:

检验原型链:

结论:由此可知,子实例继承了Dog、Animal、Object原型对象中的方法和实例属性

 2、原型链的方法使用

1、在子原型对象中新增方法

例子:

 注意:一定要先继承再对子原型对象新增方法

产生的问题:子实例构造函数类型模糊

解决办法:改变子原型对象constructor指向

 引发问题:

改变constructor指向是否会破坏原型链?

  • 答:不会原理链的继承是通过_proto_完成,而constructor只是说明它是哪个构造函数的实例

父构造函数的实例是否能使用子构造函数的方法?

答:不可以

2、在子原型对象中重写父原型对象的方法

例子:

父实例是否会受到影响?不会()

 3、如何破环原型链?

答:使用字面量定义子原型对象的方法

原因:当使用字面量定义方法时,_proto_就会指向Object而不是Animal(父原型对象),原来定义的Dog.prototype=new Animal()就会作废,原型链就此断开

 

例子:

4、原型链的问题

1、问题

  • 当子构造函数的实例修改父构造函数的属性值,所有的子类实例都会受到影响(原因:子实例共享的是同一个构造函数 类似于 我们原型模式遇到的问题)

  •  

  • 子实例化时,不能给父类型的构造函数传参

2、例子:

  •  通过原型图可知,d1、d2共享一个Dog.prototype,所以就变成原型模式遇到的问题。而我们修改的是Dog.prototype,因此父不会受到影响

3、d1添加,d2为什么会受到影响?

因为this存在于Animal中,而Animal被Dog.prototype调用,所以this指向了Dog.prototype,因此categeorys[ ]由原来的实例属性转变为原型属性存在于Dog.prototype中

4、解决办法:使用经典继承

经典继承

优点:可以在子类构造函数中向父类构造函数传参

缺点:

  • 1、与构造函数遇到的问题一样,方法需要占很多内存

  • 2、没有原型链,因此只继承了父类的实例属性、方法,不能继承父类构造函数的原型对象中的属性、方法

  • 3、每个子类的实例都持有父类的实例方法的副本,浪费内存,影响性能,而且无法实现父类的实例方法的复用(不能重写)

例子:

 

组合继承

继承方法:原型链;

继承实例属性:经典继承

例子:

 

JS中的八种继承方法 详细讲解js中的八种继承方法,原型链继承、构造函数继承(经典继承)、组合面试、原型式继承、Object.create()、寄生式继承、寄生组合继承、ES6类继承 阅读详情

相关推荐

Js实现继承的6种方式

Js实现继承的6种方式: 1.原型链继承 2.借用构造函数继承 3.组合继承(经典继承) 4.原型式继承 方法一: 方法二:Object.create() 5.寄生式继承 6.寄生组合继承 7.ES6、Class实现继承

wuliyouMaozhi的博客 2万+

【笔记】JS实现继承的几种方式

JS实现继承的几种方式

weixin_44755080的博客 2683

js的六种继承方式

1、原型链继承 核心: 将父类的实例作为子类的原型 特点: 1.非常纯粹的继承关系,实例是子类的实例,也是父类的实例 2.父类新增原型方法/原型属性,子类都能访问到 3.简单,易于实现缺点: 1.要想为子类新增属性方法,必须要在new Animal()这样的语句之后执行,不能放到构造器中 2.无法实现多继承 3.来自原型对象的所有属性被所有实例共享(来自原型对象的引用属性是所有实例共享的) 4.创建子类实例时,无法向父类构造函数传参2、构造函数继承(借助 call) 核心:使用父类的构造函数来增强子类实例

weixin_41759744的博客 7732

JavaScript继承

寄生组合继承存在效率问题,最主要的效率问题是父类构造函数始终被调用两次,一次是在创建子类原型时调用,另一次是在子类构造函数中调用,本质上,子类原型最终是要包含超类对象的所有实例属性,子类构造函数只要在执行的时候重写自己的原型就可以了。把子类的原型对象指向父类,就能使用父类中的方法属性了。采用原型式继承不自定义类型,临时创建一个构造函数,借助已有的对象作为临时构造函数的原型,然后在此基础实例化对象,并返回。继承就是指一个子类继承父类的属性方法,使得子类对象(实例化对象)具有父类的方法属性。

m0_61480985的博客 1982

JavaScriptjs中的原型继承

js中的原型继承

南栀的博客 3685

JavaScript继承方式全解析

继承方式优点缺点适用场景原型链继承实现简单,共享原型方法引用类型共享,无法传参简单继承,无引用类型属性构造函数继承避免引用类型共享,可传参无法继承原型方法仅需继承实例属性组合继承继承完整,无共享问题父类构造函数调用两次需继承完整功能寄生组合继承性能最优,避免重复调用代码复杂高性能场景ES6 Class 继承语法简洁,支持super依赖 ES6 环境现代 JavaScript 开发混入继承灵活组合多对象功能,实现多继承命名冲突,破坏封装性。

2501_92321148的博客 1784

组合继承JavaScript 中最常用的继承模式解析

组合继承JavaScript中一种结合原型链继承构造函数继承的经典模式。它通过两次调用父类构造函数:一次在子类构造函数中(Parent.call(this))确保实例属性独立,一次通过原型链绑定父类原型方法(Child.prototype = Object.create(Parent.prototype))。这种方案解决了原型链继承的引用属性共享传参问题,同时保留方法复用优势。虽然存在父类构造函数被冗余调用的问题,但其清晰的代码结构实用性使其成为ES5时代的主流继承方案,也是理解ES6类继承底层原理

你若盛开,清风自来 1159

深入解析JavaScript中的原型继承

原型继承JavaScript中的一种非常重要的继承方式。理解原型继承对于JavaScript开发非常关键。本文将详细介绍原型继承的实现原理、使用方式以及优缺点,帮助大家全面理解这一核心知识点。​原型继承JavaScript实现继承的主要方式。理解其工作原理应用方式对掌握JavaScript是非常重要的。当然,过度使用原型继承也会带来一些问题。实际项目中要灵活运用,可以搭配构造函数等方式组合使用。​。

爱蹦跶的全栈大A阿 1639

JavaScript中的继承方式详细解析

继承是面向对象软件技术当中的一个概念。如果一个类别B“继承自”另一个类别A,那么就可以把这个B称为A的子类,而把A称为B的父类,也可以称为A是B的超类。继承的优点:继承可以使得子类具有父类别的各种属性方法,而不需要再次编写相同的代码,在子类别继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性方法,使其获取与父类不同的功能。虽然JavaScript并不是真正的面向对象语言,但是它天生的灵活性,使应用场景更加丰富。

Amelian的博客 1173

JS继承 ES5;javascript继承

基础概念 说继承之前简单介绍一下,几个概念,有助于更深刻的理解继承。 能用口述或者文字的形式,说一下什么是函数吗? 按照犀牛书的说法,函数简单的说就是重复执行的代码块。函数是这样的一段JavaScript 代码,它只定义一次,但可能被执行或调用任意次。 //使用方式 //1.直接声明 function(){} //2.函数表达式 let fun = function(){} //3. new Function() var fun1 = new Function (arg1 , arg2 ,arg3 ,…

HeMister的博客 1163

[JavaScript]js有哪些继承方式

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

DaftJayee的博客 494

js继承超详细讲解:原型链继承、构造函数继承组合继承、原型式继承、寄生式继承、寄生组合继承、class继承

js继承超详细讲解前言原型链继承原型链继承的定义以及简单示例 前言 作为对象三大特性(继承、封装、多态)之一的继承,到底是什么呢?简而言之,继承就是可以使得子类具有父类的各种方法属性。 接下来我们就详细描述一下前端的js继承原型链继承 原型链继承的定义以及简单示例 先说说什么是原型链继承。通过prototype实现继承的即为原型链继承 比如说想让子类Child构造函数继承父类Person构造函数的属性方法 先让Child.prototype = new Person(),简而言之:让新实例的pro

博哥的二进制世界 706

js之三种继承方式

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

weixin_44395929的博客 493

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的博客 263

超详细通俗讲解js继承

原型链继承 实现:让子类构造函数的原型指向父类构造函数的实例。子类实例不仅会有父类构造函数中的属性,还会继承父类原型上的属性。 因此对于父类原型上的引用类型属性,所有实例都可修改。修改了子类构造函数的的原型对象,还失去了原先默认的constructor属性。即子类原型的 constructor不指向子类构造函数,而指向父类构造函数。 下例中继承关系:SuperType.prototype &...

weixin_42349231的博客 390

深度解析js继承

深度解析js继承原型链继承构造函数继承原型链+构造函数组合继承原型链+构造函数组合继承优化寄生组合继承 js继承就是一个让人头疼的问题,看了很多大佬写的js继承的博客,脑海中浮现了很多疑问,按照个人的学习三部曲:发现问题---->提出问题---->寻找解决问题的答案。接下来,我们一边提出问题一边寻找问题的答案^_^ 原型链继承 没有什么比梭哈代码更加直观,通过代码去发现问题,往往能找到意想不到的操作 function Person(name, age) { this.name

捡贝壳的木头 302

JS实现继承 JavaScript

JS实现继承 JavaScript 定义一个父类: // 定义一个动物类 function Animal (name) { // 属性 this.name = name || ‘Animal’; // 实例方法 this.sleep = function(){ console.log(this.name + ‘正在睡觉!’); } } // 原型方法 Animal.prototype.eat =...

hellogril前端库 145

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

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

wenyang12的博客 832
上一篇: JavaScripe的四种设计模式
下一篇: css盒子的种类和区别有哪些?
京拾
博客等级 码龄6年 31粉丝 · 47原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值