如何在类中创建一个不在TypeScript中的原型函数的函数?

时间:2012-12-28 13:51:24

标签: javascript typescript

当我在类中创建一个函数时,TS编译器将该函数作为原型函数,例如。

class MyClass {
    getExample()
    {

    }
}

结果是

var MyClass = (function() {
    function MyClass() {}
    MyClass.prototype.getExample = function() {};
    return MyClass;
})();​

但我需要的是

function MyClass() {

    this.getExample = function() {

    }
}​

是否可以获得这样的功能?

4 个答案:

答案 0 :(得分:3)

看一下这个JQFAQ.com链接,这里是你的问题的答案'如何在类中创建一个不会在TypeScript中使用原型函数的函数?',还有更多常见问题解答。

答案 1 :(得分:2)

我看过TypeScript(比如在线游乐场......更喜欢写自己的JS,不过:P)据我所知,你想做的事情很容易做到,我我自己尝试过一些东西,这对我来说就像是一种魅力:

class Greeter {
    greeting: string;
    closureMethod;
    constructor (message: string) {
        this.greeting = message;
        var that = this;
        var closureMethod = function()
        {
            console.log(that.greeting);
        };
        this.closureMethod = closureMethod;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}   
var greeter = new Greeter("world");
var another = new Greeter('Foobar');
var button = document.createElement('button');
button.innerText = "Say Hello";
button.onclick = function()
{
    greeter.closureMethod();
    another.closureMethod();
}
document.body.appendChild(button)

哪个有效,但更短(这也有效)

class Greeter {
    greeting: string;
    closureMethod;//define property here, no type
    constructor (message: string) {
        this.greeting = message;
        var that = this;
        this.closureMethod = function()
        {
            console.log(that.greeting);
        };
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}   

两者都产生相同的结果:一个为每个新实例定义一个方法的构造函数(老实说,不是一个好主意)。
如您所见,它使用that访问实例,而不是this,这是唯一反复创建相同方法的优点......只要你有充分的理由这样做。但是我不会对此嗤之以鼻 上面的代码,它会生成一个类似你想要的构造函数。

答案 2 :(得分:1)

您在TypeScript中添加到构造函数的方法将作为实例方法添加。

您在构造函数外部和类中添加的方法将添加到对象的原型中。如果您正在“更新”类的几个实例,因为它可以节省内存,这是首选方法。但是当你这样做时,你需要确保你有实例memebrs和正确的“this”所需的访问权限,你可以通过事先设置它们来做。

我建议先考虑原型,然后再回到实例,如果你真的需要它们的方法。如果它是一个单例对象,那么它确实没关系。

然而......当您在TypeScript中创建类时,private和public的概念不会转换为发出的JavaScript。因此,当您在JavaScript中公开每个实例成员时,请记住这一点。我更喜欢使用像JavaScript中的模块模式这样的模式,它隐藏内部变量/方法并仅暴露我想要访问的内容。您可以通过创建一个返回对象的可访问成员(没有类)的函数来使用TypeScript来实现此目的。我以为我会提到替代方案。

答案 3 :(得分:0)

你可以这样做:

class MyClass {
    static getSomething() {

    }
}

static关键字表示它不是原型方法,您不需要在实例上调用它 - 只需使用以下命令调用它:

MyClass.getSomething();

当然,这可能不是你想要的 - 但是你需要分享为什么你需要它来使它更清晰。