这是打字稿代码和生成的相应JavaScript。 为什么microsoft选择使用this.greeting而不是使用var并隐藏变量以防止在生成的js代码中从外部访问?在typescript中将属性更改为private只会引发编译错误,但生成的js代码是ditto
//typescript code
class Greeter {
greeting: string; //why is this not private by default???
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
let greeter = new Greeter("world");
console.log(greeter.greeting); //why the heck is 'greeting accessible'
//Generated javascript as follows
var Greeter = (function () {
function Greeter(message) {
this.greeting = message; //this should have been a var ????
}
Greeter.prototype.greet = function () {
return "Hello, " + this.greeting;
};
return Greeter;
}());
var greeter = new Greeter("world");
console.log(greeter.greeting); //why the heck is 'greeting accessible'

答案 0 :(得分:2)
早期就private
关键字进行了大量讨论。 TypeScript团队在一个非常大的应用程序中考虑了它的性能成本,他们认为它太棒了。
虽然在许多应用程序中性能成本可以忽略不计,但有些情况下,TypeScript用于构建数百万个LOC应用程序,如果编译的JavaScript实际上试图隐藏它们,它们将被有效地阻止使用private
变量变量。
使用构造函数局部变量的问题 私有存储是他们无法从上面的功能访问 原型对象(这是类中的方法成为的 生成JavaScript)。相反,您需要创建本地功能 对象和消耗更多的内存
您可以在原始TypeScript Codeplex site上看到我的问题版本(以及Anders'Hejlsberg的回答)。
答案 1 :(得分:1)
这是正确的,使用var
使变量在给定范围内可见,但问题是当您需要扩展class
时,则无法访问新变量类。