javascript中“指定构造函数”指持有已定义构造函数的引用并用new调用,而非动态拼接字符串;应通过变量或对象属性安全引用构造函数,避免eval等危险方式,且必须使用new操作符确保正确实例化。

关键在于:你不能在 new 的右边“动态拼字符串”去调用构造函数(比如 new window[funcName] 虽然可行但危险且不推荐),而应确保构造函数本身是可访问、可引用的值,并以安全方式调用。
1. 用变量或属性引用已有构造函数再 new
这是最常用、最安全的动态方式。把构造函数赋给变量或存在对象属性里,后续按需取用:
- 定义多个构造函数,统一管理在对象中
- 根据条件选择对应构造函数,再 new 实例
示例:
function User(name) { this.name = name; }
function Admin(name, level) { this.name = name; this.level = level; }
const Constructors = { User, Admin };
const type = 'Admin';
const instance = new Constructors[type]('Alice', 9); // ✅ 动态指定并创建
console.log(instance instanceof Admin); // true
2. 避免 eval 或字符串拼接调用
不要写 eval(`new ${className}(...)`) 或 new (Function('return ' + className))() 等方式——它们执行不可信代码、破坏作用域、无法调试、易被注入攻击。
即使技术上能跑通,也不属于“指定构造函数”的合理实践。
3. class 构造器同样适用该逻辑
ES6 class 本质仍是函数,可被引用和 new:
class Product { constructor(id, price) { this.id = id; this.price = price; } }
class Service { constructor(name, duration) { this.name = name; this.duration = duration; } }
const factory = { Product, Service };
const obj = new factory['Product'](1001, 299.99); // ✅ 完全合法
4. 注意 this 和调用方式的约束
无论怎么动态获取构造函数,都必须用 new 调用,否则:
- 非严格模式下 this 指向全局,属性挂到 window 上
- 严格模式下 this 是 undefined,赋值会报错
- 无法建立正确的原型链,instanceof 失效
所以动态拿到函数后,务必写成 new Ctor(...),不能写成 Ctor(...)。
本质上,JavaScript 中没有“运行时注册构造函数类型”的机制;所谓“指定”,就是持有对函数的引用,并遵守 new 调用约定。只要引用正确、调用合规,就能可靠创建对象。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











