当我在类中创建一个函数时,TS编译器将该函数作为原型函数,例如。
class MyClass {
getExample()
{
}
}
结果是
var MyClass = (function() {
function MyClass() {}
MyClass.prototype.getExample = function() {};
return MyClass;
})();
但我需要的是
function MyClass() {
this.getExample = function() {
}
}
是否可以获得这样的功能?
答案 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();
当然,这可能不是你想要的 - 但是你需要分享为什么你需要它来使它更清晰。