如何不使用eval()创建与已有未知类实例同类型的新实例?
不用eval创建同类型实例的简洁方案
你完全不需要绕弯子去拿构造函数名再用eval,直接利用实例本身的constructor属性就能创建新实例——这个属性本来就指向该实例所属的类。
优化后的代码
class sampleClass_A { name = "Archimedes";} class sampleClass_B { name = "Pythagoras";} let sampleInstance = new sampleClass_A(); // 直接用constructor创建新实例 let newInstanceOfTheSameClass = new sampleInstance.constructor(); console.log(newInstanceOfTheSameClass.name); // "Archimedes"
为什么这个方案可行
每个JavaScript/TypeScript实例的constructor属性默认指向它的构造函数,不管你在什么环境(Node.js、桌面应用、非浏览器环境等)下,这个属性都能正常访问,完全不依赖全局对象(比如浏览器的window)。
扩展:构造函数需要参数的情况
如果你的类构造函数需要传入参数,直接在调用时传递即可:
class sampleClass_A { constructor(public name: string) {} } let sampleInstance = new sampleClass_A("Archimedes"); let newInstance = new sampleInstance.constructor("New Archimedes"); console.log(newInstance.name); // "New Archimedes"
这个方案既避免了eval带来的安全风险和性能问题,又比你原来的实现简洁得多。
内容的提问来源于stack exchange,提问作者socebic
相关产品推荐
相关产品推荐

