【问题标题】:a reference to the constructor function对构造函数的引用
【发布时间】:2013-01-27 10:19:30
【问题描述】:

如何获取 typescript 中任何对象的构造函数的引用?

JavaScript 中的示例:

var anyObject = new this.constructor(options);

var anyObject = new someObj.constructor(options);

class Greeter { 
  greeting: string; 
  constructor(message: string, options: any) { 
       this.options = options; 
       this.greeting = message; 
  } greet() { 
     return "Hello, " + this.greeting; 
  } createAnyObj(){  
     return new this.constructor(this.options); 
  } 
} 

 var t= new Greeter('mes',{param1: 'val1'});
 var b=t.createAnyObj();

谢谢。

更多示例:

>>>Link to typescript playground

【问题讨论】:

  • createAnyObj 方法的目的是什么?它期望返回什么?

标签: javascript typescript


【解决方案1】:

您可以使用以下代码实现您所需要的:

class A {
    constructor(public options: any) {

    }

    duplicate() {
        return new A(this.options);
    }

    someMethod() {
        return 'Hello! I am class A!';
    }
}

class B extends A {
    constructor(options: any) {
        super(options);
    }

    someMethod() {
        return 'This is class B!';
    }

    duplicate() : A {
        return new B(this.options);
    }
}

var objA = new A({key1: 'value1'});
var objWhithOptionsObjA = objA.duplicate(); //=> Instaceof class A
alert(objWhithOptionsObjA.someMethod());

var objB = new B({key2: 'value2'});
var objWhithOptionsObjB = objB.duplicate(); //=> Instaceof class B
alert(objWhithOptionsObjB.someMethod());

你需要一个 B 上的构造函数,它只是将选项传递给超类。您重写 duplicate 方法以返回 B,它是 A 的子类型。

【讨论】:

  • 如果我需要从B类继承到C类,C类到D类,D类到E类...?这并不容易,需要大量重复的代码......
  • 当泛型进入 TypeScript 时,您可能会使用它来减少重复。计划在 0.9.0 发布。
【解决方案2】:

下一个解决方案解决了这个问题:

module Example{
    // Thank you, JavaScript!
    export function getConstructor(obj){
        return obj.constructor;
    }
    export class A{
        constructor(private options: any){}
        dublicate(){
            return new (getConstructor(this))(this.options);
        }
        someMethod(){
            return 'This is class A';
        }
    }
    export class B extends A{
        someMethod(){
            return 'This is class B';
        }
    }
}

// Class A
var objA = new Example.A({key1: 'val1'});
console.log(objA.someMethod(), objA); //=> This is class A
var objA2 = objA.dublicate();
console.log(objA2.someMethod(), objA2); //=> This is class A

// Class B
var objB = new Example.B({key2: 'val2'});
console.log(objB.someMethod(), objB); //=> This is class B
var objB2 = objB.dublicate();
console.log(objB2.someMethod(), objB2); //=> This is class B

现场示例 => Open playground

【讨论】:

    【解决方案3】:

    使用new 运算符在构造函数中使用所需参数实例化对象。这类似于你在其他面向对象编程语言中的做法,下面是来自 typescript 官方网站的示例

    class Greeter {
        constructor(public message: string, public options?: any) {          
         }
    
         greet() {
          return "Hello, " + this.message;
         }
    
         createAnyObj(){  
            return new Greeter(this.message, this.options);         
         } 
    }
    
    var greeter = new Greeter("world");
    

    【讨论】:

    • 示例:类 Greeter { 问候语:字符串;构造函数(消息:字符串,选项:任何){ this.options = options; this.greeting = 消息; } greet() { 返回“你好” + this.greeting; } createAnyObj(){ return new this.constructor(this.options); } }
    • 为什么你需要在类中创建除 Greeter 之外的任何其他对象(createAnyObj)?您希望从该方法返回什么对象类型?
    • 我添加了更多示例。见链接。谢谢。
    • 请参阅 TypeScript 操场中的示例示例 - tinyurl.com/c7cxn5w 。我还更新了我对您最新更新的回答
    • 这个解决方案不合适,因为对象 [objWhithOptionsObjB] instanceof [class A]。这是错误!示例:objWhithOptionsObjB.someMethod(); => '你好!我是A班!'。
    猜你喜欢
    • 2020-04-30
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 2012-11-15
    相关资源
    最近更新 更多