JavaScript 如何实现继承

你有没有过这样的经历:写代码时发现好几个功能模块长得差不多,反复复制粘贴后,改起bug来连自己都找不着北?这时候“继承”就像一个高效的“代码模板”,能让你少写重复的逻辑,省下时间做更有意思的事。在前端开发里,JavaScript的继承就是帮你搭建这种“模板”的工具,今天咱们就用生活化的例子把它说透。

先搞懂:继承到底是啥?

举个例子,你有一台粉色的儿童滑板车,它有轮子、车把,还能滑;后来你想给弟弟做一台同款的滑板车,只是要把轮子换成更大的越野轮,还要加个刹车——这时候你不用重新做一辆,只要“继承”原来滑板车的核心功能,再改改细节就行。

JavaScript 如何实现继承

对应到代码里,就是让一个“新对象”自动拿到“旧对象”里的属性和方法,还能自己加新东西。JavaScript里的继承有几种常用方式,咱们一个个说。

最简单的:原型链继承

JavaScript里每个对象都有个“原型”,就像你买滑板车时附的说明书,上面写着基础功能。如果让新对象的原型指向旧对象,就形成了“原型链”——新对象就能用旧对象的所有东西。

还是用滑板车举例:先做一个基础的“普通滑板车”模板,它有轮子数量=2、滑起来()方法;再做一个“越野滑板车”,让它的原型指向普通滑板车,这样它就自动有了2个轮子和滑的功能,你再给它加个越野轮属性就行。

不过这种方式有个小问题:如果多个越野滑板车改了同一个属性,比如把轮子换成3个,会影响所有用这个原型的滑板车——就像你改了弟弟的滑板车,你的那台也跟着变了,不太方便。

解决共享问题:借用构造函数继承

刚才的问题出在原型共享,那咱们换个思路:新对象创建时,专门给它单独做一套属性。这就是“借用构造函数继承”。

比如做滑板车时,先写一个“造滑板车的工厂”,里面定义轮子数量和滑起来()方法;做新的越野滑板车时,在它的构造函数里调用这个工厂,用call方法把工厂里的this指向自己,这样每个越野滑板车都有自己的轮子属性。

这就像你给弟弟做滑板车时,单独给他画轮子的尺寸,不会改到你的那台。但它也有缺点:方法每次都得重新做,不能共用——就像你给弟弟做的刹车,不能直接拿来给你的滑板车用,浪费代码。

实际开发最常用:组合继承

既然原型链能共享方法,构造函数能保证属性独立,那把两者结合不就完美了?这就是“组合继承”,也是前端里最常用的方式。

还是滑板车:用原型链把基础的滑起来()方法挂在原型上,让所有滑板车共用;用构造函数给每个滑板车单独设置轮子数量属性。这样,你的滑板车有自己的轮子,弟弟的也有自己的,刹车方法大家能共享,既不冲突又省代码。

更灵活的现代方式:ES6类继承

后来JavaScript加了ES6语法,用class和extends就像写中文一样直白,不用再搞复杂的原型链。

比如写class 普通滑板车,里面有constructor()设轮子,还有滑起来()方法;然后写class 越野滑板车 extends 普通滑板车,它会自动继承轮子和滑的功能,你再加个越野功能()方法就行。就像你用现成的滑板车模板,直接填越野的特殊功能,不用管底层怎么搭。

其实JavaScript的继承本质就是“复制加修改”,就像你抄作业时,只抄核心步骤,改自己的答案。选哪种方式不用纠结,简单场景用ES6类,复杂场景用组合继承,核心都是减少重复代码,让开发更省心。

上一篇 Java ClassNotFoundException 怎么解决