我希望根据变量的值来实例化各种类。
如该Stackblitz https://angular-nsdbu3.stackblitz.io所示,如果构造函数中没有参数,则可以正常工作,但是在构造函数中具有参数时,它将失败。
我做错什么了吗,或者如果构造函数中有参数,没有办法做我想要的目标吗?
// WITH PARAMETERS
export class Foo {
prop1: string;
constructor(prop1: string="foo!") {
console.log("Foo constructor: "+prop1);
}
}
// WITHOUT PARAMETERS
export class Bar {
prop1: string;
constructor() {
this.prop1 = "bar!";
console.log("Bar constructor:"+this.prop1)
}
}
测试台:
export class HelloComponent {
@Input() name: string;
objClasses = {
foo: Foo,
bar: Bar
}
ngOnInit() {
let thisTypeOne = this.objClasses.foo;
let myFooObj = new (thisTypeOne)();
let anotherFooObj = new (thisTypeOne)("bazz");
console.log("My Foo Obj: " + myFooObj.prop1); // *** Undefined
console.log("Another Foo Obj: " + anotherFooObj.prop1); // *** Undefined
let thisTypeTwo = this.objClasses["bar"];
let myBarObj = new (thisTypeTwo)();
console.log("My Bar Obj: "+myBarObj.prop1); // *** bar!
答案 0 :(得分:0)
您可以使用Object.create(proto, [propertiesObject])
,将类名传递给此函数,它将返回对象。但是属性部分应定义为对象,因此您不能将参数直接传递给构造函数。所以在您的代码中尝试一下;
let anotherFooObj = Object.create(thisTypeOne, {prop1:{value:"buzz"}});
答案 1 :(得分:-1)
您忘记在构造函数中设置实例属性-TypeScript不会自动进行设置。
export class Foo {
prop1: string;
constructor(prop1: string="foo!") {
console.log("Foo constructor: "+prop1);
this.prop1 = prop1;
}
}