打字稿中的私人公众

时间:2016-07-20 19:54:50

标签: javascript typescript

这是打字稿代码和生成的相应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'




2 个答案:

答案 0 :(得分:2)

早期就private关键字进行了大量讨论。 TypeScript团队在一个非常大的应用程序中考虑了它的性能成本,他们认为它太棒了。

虽然在许多应用程序中性能成本可以忽略不计,但有些情况下,TypeScript用于构建数百万个LOC应用程序,如果编译的JavaScript实际上试图隐藏它们,它们将被有效地阻止使用private变量变量。

  

使用构造函数局部变量的问题   私有存储是他们无法从上面的功能访问   原型对象(这是类中的方法成为的   生成JavaScript)。相反,您需要创建本地功能   对象和消耗更多的内存

您可以在原始TypeScript Codeplex site上看到我的问题版本(以及Anders'Hejlsberg的回答)。

答案 1 :(得分:1)

这是正确的,使用var使变量在给定范围内可见,但问题是当您需要扩展class时,则无法访问新变量类。