详解JavaScript中的构造器Constructor模式
本文深入解析JavaScript中的构造器模式,涵盖对象创建的两种基本方式、带原型的构造器实现方法共享,以及通过实例演示继承链中的初始化顺序、变量赋值与多态调用机制,帮助开发者避免常见陷阱。
构造器模式概述
构造器模式的简要概述(参考图示):

构造器(Constructor)本身不支持继承,因此无法被重写(Overriding),但支持重载(Overloading)。构造器的主要职责是创建特定类型的对象,为使用做好准备,同时接收参数以在首次实例化时初始化成员属性和方法的值。
1、创建对象
新对象创建的两种方法
var newObject={};
var newObject=new object();//object 构造器的简洁记法
基本构造器实现
2、基本Constructor
在JavaScript不支持传统类的情况下,对象与构造器通过new关键字进行实例化,代码示例大致如下:
function Car(model,year,miles){
this.model=model;
this.year=year;
this.miles=miles;
this.toString=function()
{
return this.model+"has done"+this.miles+"miles";
};
};
//用法
//可以创建car新实例
var civic=new Car("Hona Civic",2009,2000);
var mondeo=new Car("Ford Mondeo",2010,5000);
console.log(civic.toString());
console.log(mondeo.toString());
带原型的构造器
3、带原型的Constructor
JavaScript具备prototype属性。当通过构造器创建新对象后,该对象将自动拥有构造器原型上的所有属性。利用这种方式,可以创建多个Car对象,并使它们访问相同的原型。
funcion() Ca(model,year,miles){
this.model=model;
this.year=year;
this.miles=miles;
//注意使用Object.prototype.newMethod 而不是Object.prototype是为了重新定义prototype对象
Car.prototype.toString=function(){
return this.model+"Has done" +this.miles+"miles";
};
};
//用法
var civic=new Car("Honda Civic",2009,20000);
var momdeo=new Car("Ford Mondeo",2010,5000);
console.log(civic.toString());
console.log(mondeo.toString());
此时,toString()方法的单一实例便可以在所有Car对象之间共享。
构造器常见陷阱与初始化顺序
接下来分享构造器(constructor)在实际项目中容易出现的典型问题。
class A {
public int Avar;
public A() {
System.out.println("AAA");
doSomething();
}
public void doSomething() {
Avar = 1111;
System.out.println("A.doSomething()");
}
}
public class B extends A {
public int Bvar = 2222;
public B() {
System.out.println("BBB");
doSomething();
System.out.println("Avar=" + Avar);
}
public void doSomething() {
System.out.println("Bvar=" + Bvar);
}
public static void main(String[] args) {
new B();
}
}
执行顺序如下:首先创建B类实例,这需要先调用A类的构造器,输出“AAA”,随后调用dosomething方法。需要注意的是,A类中的该方法已被B类覆盖,而当前实例是B的对象,因此实际调用的是B的方法。由于BVAR在此时尚未赋值,其自动初始化为0。
接着生成B对象,先初始化变量BVAR,然后调用构造器输出“BBB”,随后调用方法。此时BVAR已初始化为2222,因此输出“Bvar=2222”。而对象A中的变量AVAR因为未调用对象A的dosomething方法,其值保持为0,故输出“0”。
最终的全部输出结果如下:
AAA Bvar=0 BBB Bvar=2222 Avar=0
注意初始化顺序:当涉及继承时,先生成超类对象,生成对象时,先生成静态变量,然后是一般变量,最后调用构造器!当所有超类对象生成后,再生成本对象,顺序相同!当方法被覆盖时,调用当前对象的方法!这一点需要特别注意。
D3.js 比例尺与坐标轴的配置详解
2026-11-05 16:54:46
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
