从构造函数调用方法:错误:未捕获TypeError:undefined不是函数

时间:2014-05-21 18:52:07

标签: javascript html5 syntax typescript grammar

任务:我需要在Typescript中构建一个类,在其自己的构造函数中调用它自己的方法。

问题:以下示例代码所代表的实际代码将成功编译,但在Javascript控制台中进行测试时,它不会。

示例:

export class volumeEQ
{
    constructor(ctx:any) 
    {
        this.ctx = ctx;         // Audio context saved into member variable of class
        this.setupAudioNodes(); // Sets up nodes made out of audio
    }

    setupAudioNodes()
    {
        this.sourceNode.connect(this.ctx.destination); // Connect to destination
    }
}

技术:Typescript编译器对this.setupAudioNodes()没有问题,但在浏览器的Javascript控制台中称为Javascript后,我收到错误Uncaught TypeError: undefined is not a function。实际上,这是Javascript的this.语法的一个问题,以及它如何容易与之混淆。但是因为我在Typescript中开发,我想要一个更多的Typescript风格的解决方案。

问题:如何从打字稿中的构造函数调用类的方法?

3 个答案:

答案 0 :(得分:9)

以下是如何从构造函数中调用方法:

class Thing {
    constructor(name: string) {
        this.greet(name);
    }

    greet(whatToGreet: string) {
        console.log('Hello, ' + whatToGreet + '!')
    }
}

var x = new Thing('world'); // Prints "Hello, world!"

答案 1 :(得分:6)

以下是我要找的内容。

解决方案来源:
How can I preserve lexical scope in TypeScript with a callback function

如何在Typescript中保留this.的词法范围:

如果方法的以下声明不起作用:

export class myClass
{
    constructor()
    {
        var myString:string = this.myMethod(true);
    }

    public myMethod(useBigString:boolean) : string
    {
        if(useBigString)
        {
            return "bigString";
        }
        return "smlStr";
    }
}

在javascript中生成一个方法,如下所示:

myClass.prototype.myMethod = function (useBigString) {



相反,尝试以这种方式声明您的方法:

export class myClass
{
    constructor()
    {
        var initString:string = this.myMethod(true);
    }

    public myMethod = (useBigString:boolean) : string => {
        if(useBigString)
        {
            return "bigString";
        }
        return "smlStr";
    }
}

在构造函数中声明javascript中的方法:

this.myMethod = function(useBigString) {



缺点是方法语法突出显示不会识别这种定义,但它绝对是编译和工作!这种情况不像类方法那样适用于类变量。

答案 2 :(得分:0)

<强>研究

临时黑客:

  • 创建一个具有您想要调用的方法的类,但保留构造函数尽可能基本。
  • 下一个创建扩展第一个类的第二个类。
  • 从超类中调用方法。 示例: super.myFunction();


样品:

export class basicEQ
{
    constructor(ctx:any)
    {
        this.ctx = ctx;         // Audio context saved into member variable of class
    }
    setupAudioNodes()
    {
        this.sourceNode = this.context.createBufferSource(); // Create Buffer Source Node
        this.sourceNode.connect(this.ctx.destination); // Connect to destination
    }
}

export class volumeEQ extends basicEQ
{
    constructor(ctx:any)
    {
        super(ctx);
        super.setupAudioNodes(); // Use super, Not this
    }

}


黑客解释:
在构造函数中使用super.代替this.进行方法调用。通过扩展你的课程来做到这一点,你可以在第一时间打电话给超级。 示例: export class myUsableClass extends myBaseClass。现在,myBaseClass包含所有方法,myUsableClass可以从构造函数中调用它们。

我的解决方案是针对实际问题的解决方法,但很高兴知道存在解决问题的方法。如果其他人有其他方法来克服这个问题,请发帖! :)