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