问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JavaScript常用的六种继承方式

发布网友 发布时间:2024-09-06 01:48

我来回答

1个回答

热心网友 时间:2024-09-09 05:11

1.原型链继承

原型链继承是比较常见的继承方式之一,其中涉及的构造函数、原型和实例,三者之间存在着一定的关系,即每一个构造函数都有一个原型对象,原型对象又包含一个指向构造函数的指针,而实例则包含一个原型对象的指针

举个例子

functionParent(){this.name='parent1';this.play=[1,2,3]}functionChild(){this.type='child2';}Child1.prototype=newParent();console.log(newChild())

缺点:

多个实例对引用类型的操作会被篡改。

2.构造函数继承

借助call调用Parent函数

functionParent(){this.name='parent1';}Parent.prototype.getName=function(){returnthis.name;}functionChild(){Parent1.call(this);this.type='child'}letchild=newChild();console.log(child);//没问题console.log(child.getName());//会报错

缺点:

只能继承父类的实例属性和方法,不能继承原型属性/方法

无法实现复用,每个子类都有父类实例函数的副本,影响性能

3.组合继承

前面我们讲到两种继承方式,各有优缺点。组合继承则将前两种方式继承起来

functionParent3(){this.name='parent3';this.play=[1,2,3];}Parent3.prototype.getName=function(){returnthis.name;}functionChild3(){//第二次调用Parent3()Parent3.call(this);this.type='child3';}//第一次调用Parent3()Child3.prototype=newParent3();//手动挂上构造器,指向自己的构造函数Child3.prototype.constructor=Child3;vars3=newChild3();vars4=newChild3();s3.play.push(4);console.log(s3.play,s4.play);//不互相影响console.log(s3.getName());//正常输出'parent3'console.log(s4.getName());//正常输出'parent3'

缺点:

会执行两次父类的构造函数,造成多构造一次的性能开销

4.原型式继承

这里主要借助Object.create方法实现普通对象的继承

同样举个例子

letparent4={name:"parent4",friends:["p1","p2","p3"],getName:function(){returnthis.name;}};letperson4=Object.create(parent4);person4.name="tom";person4.friends.push("jerry");letperson5=Object.create(parent4);person5.friends.push("lucy");console.log(person4.name);//tomconsole.log(person4.name===person4.getName());//trueconsole.log(person5.name);//parent4console.log(person4.friends);//["p1","p2","p3","jerry","lucy"]console.log(person5.friends);//["p1","p2","p3","jerry","lucy"]

缺点:

因为Object.create方法实现的是浅拷贝,多个实例的引用类型属性指向相同的内存,存在篡改的可能

5.寄生式继承

寄生式继承在上面继承基础上进行优化,利用这个浅拷贝的能力再进行增强,添加一些方法

letparent5={name:"parent5",friends:["p1","p2","p3"],getName:function(){returnthis.name;}};functionclone(original){letclone=Object.create(original);clone.getFriends=function(){returnthis.friends;};returnclone;}letperson5=clone(parent5);console.log(person5.getName());//parent5console.log(person5.getFriends());//["p1","p2","p3"]

其优缺点也很明显,跟上面讲的原型式继承一样

6.寄生组合式继承

寄生组合式继承,借助解决普通对象的继承问题的Object.create方法,在前面几种继承方式的优缺点基础上进行改造,这也是所有继承方式里面相对最优的继承方式

functionParent(name){this.name=name;this.say=()=>{console.log(111);};}functionChildren(name){Parent.call(this);this.name=name;}Children.prototype=Object.create(Parent.prototype);Children.prototype.constructor=Children;参考文献

web-interview/inherit.mdatmaster·febobo/web-interview(github.com)

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
冠心病头疼头胀是要犯病吗 头疼是冠心病导致的吗 冠心病会头疼,昏昏沉沉的吗 冠心病导致头痛的原因是什么 小番茄为何又叫圣女果? 兴业信用卡境外取现怎么收费? Win10系统电脑死机显示dcom错误1068怎么办dcom遇到错误1068导致死机 win10系统dcom遇到错误1068导致死机怎么办 win10系统dcom遇到错误1068导 ... 刮毛好不好 我脸部的小汗毛曾经用剃眉刀刮过,现在又长长拉,好像也变粗拉,怎么... pb中OpenSheet(W_findbook1,w_main,0,Original!)这句话是什么意思?_百 ... C语言函数问题:求数组original中正整数个数;右移1位后新数是偶数的个... 狗吃生鸡蛋可以吗 微信服务号怎么取消通知消息? 如何关闭微信服务号通知 微信服务号如何取消关注? 怎么样才能取消微信的服务通知呢? 微信关闭服务号的方法主要有两种,如何关闭 请教西宁到拉萨的交通?求大神帮助 如何取消订阅微信服务号的消息通知 筹资风险什么意思 筹资风险有哪些 上海迪士尼门票多少钱一张2023 为什么厨房地面拖完地有水渍客厅没水渍 长城m4用双星轮胎和锦湖轮胎哪个好 锦湖和双星轮胎哪个好 锦湖轮胎和双星轮胎哪个好 行政组织学形 馅饼怎么做软和好吃又薄 牛肉馅饼这道美食在口感和色彩上有哪些独特之处? ...函数,其中有写到 public String(String original){ this.value =... 微波干燥那家好? 中老年人怎样消除眼袋最有效 翡翠树叶吊坠适合配什么材质的链子? 关于蚕豆病患者的抗生素合理使用问题。 蚕豆病能吃双黄连吗 如果让你用一百个词形容她,你会怎么说呢? 如何在一百个优点里面挑选出一个优点夸她呢? 如何列举朋友一百条优点? 蜂蜜柚子茶一天喝几次 柚子蜂蜜茶什么时候喝 假如猫咪会说话内容提要 如何确定票据纠纷案件的管辖法院 如何判断是否构成诈骗罪? 行为人什么情况属于诈骗犯罪? 2024骗婚行为属于诈骗吗? 阻碍解救被绑架儿童罪一般判几年? 高空坠物责任倒置的责任应该由谁承担 有哪些有药感的香水值得推荐? 有哪些好闻的品牌香水值得推荐? 长安马自达和一汽马自达哪个更好