用构造函数创建可复用业务对象,核心是封装共性逻辑于函数体,通过new生成独立实例并共享原型方法;Order构造函数初始化订单属性,原型挂载getTotal等通用行为;RefundOrder通过call复用Order初始化并扩展专属逻辑;class语法为原型机制的语法糖,不改变复用本质。

用构造函数创建可复用的业务对象,核心是把共性逻辑封装进函数体内,通过 new 调用生成独立实例,每个实例拥有自己的属性,同时共享原型上的方法。
定义构造函数,明确业务职责
构造函数名首字母大写,内部用 this 绑定实例属性,体现业务语义。比如处理用户订单:
function Order(id, items, customerName) {
this.id = id;
this.items = Array.isArray(items) ? items : [];
this.customerName = customerName;
this.status = 'pending';
this.createdAt = new Date();
}这样每次 new Order(...) 都产出一个结构一致、状态隔离的对象,适合订单创建、查询、临时修改等场景。
把通用行为挂到原型上,节省内存
避免在构造函数里重复定义方法,而是统一放在 Order.prototype 上:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Order.prototype.getTotal = function() { return this.items.reduce((sum, item) => sum + item.price * item.qty, 0); };Order.prototype.confirm = function() { this.status = 'confirmed'; };Order.prototype.isOverAmount = function(threshold) { return this.getTotal() > threshold; };
所有实例共享这些方法,不随实例数量增加而占用额外内存,也便于后续统一维护或扩展。
结合 call/apply 实现灵活初始化或继承
当需要复用其他构造逻辑(如让 RefundOrder 复用 Order 的基础字段),可用 call 借用构造过程:
function RefundOrder(id, items, customerName, refundReason) {
Order.call(this, id, items, customerName); // 复用初始化
this.refundReason = refundReason;
this.refundAt = null;
}
RefundOrder.prototype = Object.create(Order.prototype);
RefundOrder.prototype.constructor = RefundOrder;这样 RefundOrder 实例既有订单基础能力,又能扩展退款专属逻辑,保持业务分层清晰。
配合工厂函数或 ES6 class 提升可读性(可选)
纯构造函数适合需要显式控制 this 或兼容老环境的场景;若团队偏好更直观语法,可用 class 封装相同逻辑:
class Order {
constructor(id, items, customerName) {
this.id = id;
this.items = Array.isArray(items) ? items : [];
this.customerName = customerName;
this.status = 'pending';
this.createdAt = new Date();
}
getTotal() { /* ... */ }
confirm() { /* ... */ }
}本质仍是基于原型的构造函数机制,只是语法糖,不影响复用性和实例隔离性。

















