JavaScript实现继承的6种方式,46道面试题带你了解高级前端面试

本文详细介绍了JavaScript中的几种继承模式,包括SuperType和SubType的构造函数继承、原型链方式、组合继承(融合原型链和构造函数优点)、原型式继承(基于对象创建新对象)、寄生式继承以及寄生组合式继承。作者强调了各种模式的特点、优缺点和适用场景。
摘要由CSDN通过智能技术生成

function SuperType(name){

this.name = name;

this.colors = [“red”,“green”,“blue”];

}

SuperType.prototype.sayName = function(){

alert(this.name);

};

function SubType(name,age){

// 借用构造函数方式继承属性

SuperType.call(this,name);

this.age = age;

}

// 原型链方式继承方法

SubType.prototype = new SuperType();

SubType.prototype.constructor = SubType;

SubType.prototype.sayAge = function(){

alert(this.age);

};

var instance1 = new SubType(“luochen”,22);

instance1.colors.push(“purple”);

alert(instance1.colors); // “red,green,blue,purple”

instance1.sayName();

instance1.sayAge();

var instance2 = new SubType(“tom”,34);

alert(instance2.colors); // “red,green,blue”

instance2.sayName();

instance2.sayAge();

组合继承避免了原型链和借用构造函数的缺陷,融合了它们的优点,成为 javascript 中最常用的继承模式。而且,使用 instanceof 操作符和 isPrototype() 方法也能够用于识别基于组合继承创建的对象。

但它也有自己的不足 – 无论在什么情况下,都会调用两次超类型构造函数:一次是在创建子类型原型的时候,另一次是在子类型构造函数内部。

4、原型式继承

// 借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型。

1、自定义一个函数来实现原型式继承

function object(o){

function F(){}

F.prototype = o;

return new F();

}

在 object() 函数内部,先创建一个临时性的构造函数,然后将传入的对象作为这个构造函数的原型,最后返回这个临时类型的一个新实例。实质上,object() 对传入其中的对象执行了一次浅复制

使用 Object.create() 方法实现原型式继承

这个方法接收两个参数:一是用作新对象原型的对象和一个为新对象定义额外属性的对象。在传入一个参数的情况下,此方法与 object() 方法作用一致。在传入第二个参数的情况下,指定的任何属性都会覆盖原型对象上的同名属性。

var person = {

name: “luochen”,

colors: [“red”,“green”,“blue”]

};

var anotherPerson1 = Object.create(person,{

name: {

value: “tom”

}

});

var anotherPerson2 = Object.create(person,{

name: {

value: “jerry”

}

});

anotherPerson1.colors.push(“purple”);

alert(anotherPerson1.name); // “tom”

alert(anotherPerson2.name); // “jerry”

alert(anotherPerson1.colors); // “red,green,blue,purple”

alert(anotherPerson2.colors); // “red,green,bule,purple”;

只是想让一个对象与另一个对象类似的情况下,原型式继承是完全可以胜任的。但是缺点是:包含引用类型值的属性始终都会共享相应的值

5、寄生式继承

// 创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后返回这个对象

function createPerson(original){

var clone = Object.create(original); // 通过 Object.create() 函数创建一个新对象

clone.sayGood = function(){ // 增强这个对象

alert(“hello world!!!”);

};

return clone; // 返回这个对象

}

在主要考虑对象而不是自定义类型和构造函数的情况下,寄生式继承也是一种有用的模式。此模式的缺点是做不到函数复用

6、寄生组合式继承

// 通过借用构造函数来继承属性,通过原型链的混成形式来继承方法。本质上,就是使用寄生式继承来继承超类型的原型,然后再将结果指定给子类型的原型

function SuperType(name){

this.name = name;

this.colors = [“red”,“green”,“blue”];

}

SuperType.prototype.sayName = function(){

alert(this.name);

};

function SubType(name,age){

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

x-1710878496669)]
[外链图片转存中…(img-i8jti5S6-1710878496669)]
[外链图片转存中…(img-HbNMZmOl-1710878496669)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-6yPT55BU-1710878496670)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值