new.target 无法实现流式抽象工厂模式,它仅是构造上下文检测工具,用于判断是否通过 new 调用,不具备动态选族、可替换、可组合等抽象工厂核心能力,正确做法应分层协作:builder 暴露流式接口,抽象工厂定义契约,具体工厂实现成套产品,new.target 仅作安全校验。

new.target 无法实现符合国际标准的流式抽象工厂设计模式。
它不是流式构造机制,也不参与工厂逻辑设计,更不满足抽象工厂模式对“产品族一致性”“运行时可切换”“客户端解耦”等核心要求。将 new.target 与“流式抽象工厂”挂钩,属于对语言特性和设计模式的双重误用。
new.target 的真实定位是构造上下文检测工具
仅在类或构造函数内部可用,用于判断当前调用是否由 new 触发。它的作用域严格限于单个构造函数执行期,不具备跨对象、跨环境、跨请求的调度能力,也无任何流式(如链式调用、异步组装、配置累积)语义。
所谓“流式抽象工厂”需依赖以下能力,而 new.target 全都不提供:
- ✅ 支持按主题/环境/策略动态选择整套产品(如
DarkButton + DarkDialog + DarkCheckbox) - ✅ 工厂实例可被注入、复用、替换(如 DI 容器中注册
IThemeFactory) - ✅ 创建过程可组合、可延迟、可带上下文参数(如
.withTheme('dark').forPlatform('mobile')) - ✅ 产品间存在强契约约束(编译期类型一致、生命周期协同、状态隔离)
实际可行的路径是分层协作,而非让 new.target 承担职责:
- 流式接口由专门的 Builder 或 Factory 类暴露(如
UIFactory.theme('dark').platform('web').build()) - 抽象工厂接口定义产品族契约(如
interface ThemeFactory { createButton(): Button; createDialog(): Dialog; }) - 具体工厂实现确保产品成套(如
class DarkFactory implements ThemeFactory) -
new.target仅在个别具体类内部作安全校验(例如防止DarkButton()被当函数调用),属辅助兜底,非主干逻辑
典型错误示例(应避免):
// ❌ 错误:把分流逻辑塞进 new.target,既不可读也不可测
class StreamFactory {
constructor(type) {
if (new.target === StreamFactory && type === 'dark') {
return new DarkFactory(); // 语义混乱,违反构造函数契约
}
}
}
正确做法是明确分工:
- 工厂创建交给配置驱动或 DI 容器(如
services.AddSingleton<themefactory>(sp => new DarkFactory())</themefactory>) - 流式语法由独立 builder 封装(返回新 builder 实例,不破坏
new语义) -
new.target仅用于保护具体产品类(如class DarkButton { constructor() { if (!new.target) throw 'use new'; } })
不复杂但容易忽略。










