JavaScript类式继承模式详解与局限
本文探讨JavaScript中的类式继承模式,这是一种基于构造函数的代码复用方式。通过定义Parent和Child构造函数并建立原型链,子类可继承父类方法。然而,该模式存在显著缺陷:无法向子构造函数传递参数,且每次实例化都会重新创建父对象实例,导致效率低下。文章分析了其工作原理及局限性,为理解现代JavaScript继承机制提供基础。
JavaScript代码复用的基本原则
代码复用遵循GoF提出的著名原则:优先使用对象组合而非类继承。由于JavaScript没有类的概念,其代码复用方式并不局限于类式继承。JavaScript创建对象的方法多样,包括使用构造函数配合new关键字创建对象,以及动态修改对象属性。此外,JavaScript支持多种非类式继承(即现代继承模式)的复用方法,例如通过组合其他对象构建目标对象、应用对象混入技术,以及借用和复用特定方法。
类式继承模式的实现与局限
类式继承模式(默认模式)
以下示例展示了Parent和Child两个构造函数的关系:
代码如下:
function Parent(name){
this.name = name||"Adam";
}
Parent.prototype.say = {
return this.name;
};
function Child(name){
}
inherit(Child,Parent);
以下是可复用继承函数inherit()的一种实现方式:
代码如下:
function inherit(C,P){
C.prototype = new P();
}
此处原型属性应指向一个对象,而非函数。因此,它必须指向由父构造函数创建的实例,而非直接指向构造函数本身。
此后,创建Child对象时,将通过原型从Parent实例获取其功能:
代码如下:
var kid =new Child();
kid.say();//"Adam"
调用继承后的原型链如下:
进一步为kid添加属性:
代码如下:
var kid = new Child();
kid.name = "Patrick";
kid.say();//"Patrick"
此时原型链的变化情况如下:
若能在自身对象属性中找到name,则无需继续查找原型链。
使用上述模式存在一个缺点:同时继承了两个对象的属性,即添加到this的属性以及原型属性。在大多数情况下,我们并不需要这些自身的属性。
另一个缺点是,使用inherit()继承时,不支持将参数传递给子构造函数,例如:
代码如下:
var s = new Child("Seth");
s.say();//"Adam"
这一结果并非期望值。尽管子构造函数可以将参数传递到父构造函数中,但每次需要子对象时都必须重新执行这种继承机制,且效率低下。原因在于最终会重新创建父对象。
本文暂告一段落,后续我们将持续更新JavaScript代码复用模式的其余几种模式。
JavaScript怎么准确判断数据类型:typeof、instanceof与Object.prototype.toString
2026-11-05 17:09:21
JS中将数组和对象混合组装为JSON字符串
2026-11-05 16:41:42
JS运算符优先级与结合性的区别是什么?
2026-11-05 13:22:02
JS Map怎么只遍历Key或Value
2026-11-05 13:00:36
D3.js 与 ECharts 选型对比:灵活性 vs 开发效率
2026-11-05 09:45:01
