Javascript 如何在类中创建不属于TypeScript中原型函数的函数?

Javascript 如何在类中创建不属于TypeScript中原型函数的函数?,javascript,typescript,Javascript,Typescript,例如,当我在类中创建函数时,TS编译器将该函数作为原型函数 class MyClass { getExample() { } } 结果是 var MyClass = (function() { function MyClass() {} MyClass.prototype.getExample = function() {}; return MyClass; })();​ 但我需要的是 function MyClass() { th

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

class MyClass {
    getExample()
    {

    }
}
结果是

var MyClass = (function() {
    function MyClass() {}
    MyClass.prototype.getExample = function() {};
    return MyClass;
})();​
但我需要的是

function MyClass() {

    this.getExample = function() {

    }
}​

有可能得到这样的函数吗?

我看过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)
这很有效,但更短(这也很有效)

两者都产生相同的结果:一个构造函数为每个新实例反复定义一个方法(老实说,这不是一个好主意)。
如您所见,它使用
that
访问实例,而不是
this
,这是反复创建相同方法的唯一好处。。。只要你有充分的理由这么做。但我不会就此大发雷霆。

上面的代码可以工作,它生成一个与您想要的构造函数类似的构造函数。

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

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

我建议先考虑原型,然后再回到实例,如果您真的需要它们作为方法的话。如果它是一个单例对象,那么它真的不重要


然而。。。在TypeScript中创建类时,private和public的概念不会转换为发出的JavaScript。因此,在JavaScript中公开每个实例成员时,请记住这一点。我更喜欢使用类似JavaScript中的模块模式的模式,它隐藏内部变量/方法,只公开我希望访问的内容。通过创建一个返回对象的可访问成员(无类)的函数,可以使用TypeScript实现这一点。我想我会提到另一种选择。

你可以这样做:

class MyClass {
    static getSomething() {

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

MyClass.getSomething();

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

看看这个链接,下面是你的问题“如何在类中创建一个不属于TypeScript中原型函数的函数?”的答案,还有更多常见问题解答。

我从来没有使用过TypeScript,但是你也可以这么做,只要把它放在构造函数()中,我可以问一下为什么吗?唯一的区别是,在最后一种情况下,
getExample
方法可以从实例中永久删除,您将使用在脚本中创建的每个实例创建一个新函数对象。。。原型存在是有充分理由的。您可能拥有的唯一应用程序是当您使用闭包变量时,但在您的应用程序中看不到这些变量的任何痕迹snippet@Prinzhorn考虑到我有更多的功能,在构造(EliasVanOotegem)中引用整个事物不是一种高效的方式。是的,我有一些闭包变量,比如
var=this
@BalaKrishnan:那么就可以用定义闭包变量的相同方式为变量分配一个函数了。只需添加
that.getExample=getExample
在构造函数的末尾,如果您使用
this.closureMethod=()=>console.log(that.greeting),则应该执行以下操作:这个
和那个是由ts为您管理的。@SWeko:什么意思?它转换成规则的JS,我看了生成的代码,并使用<代码> <代码>有区别,考虑如下:<代码> var Fo=实例.CululueDebug < /C> >,当我添加<代码>控制台.log(这个===);
对于该方法,
foo()
logs false:它的上下文不是
that
引用的对象,对不起,我的意思是
this.closurethod=()=>console.log(this.greeting)
,并完全删除该
。ts编译器自动插入一个名为
\u this
的变量,该变量执行
的工作,该
@SWeko:我尝试依赖
\u this
,但TypeScript给了我一个错误:没有引用正在创建的实例的闭包变量
该函数需要
才能工作,即使调用上下文发生了变化,就像我在上一篇评论中所说的那样,我将对方法的引用分配给了
foo
,然后调用了
foo()
<代码>此
将指向全局对象(
窗口
)和
窗口。问候语
未定义-->不理想,特别是如果我要为属性赋值:我将设置全局值
MyClass.getSomething();