任务:我需要在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风格的解决方案。
问题:如何从打字稿中的构造函数调用类的方法?
答案 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
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
可以从构造函数中调用它们。
我的解决方案是针对实际问题的解决方法,但很高兴知道存在解决问题的方法。如果其他人有其他方法来克服这个问题,请发帖! :)