【问题标题】:private public in Typescript [duplicate]Typescript中的私人公共[重复]
【发布时间】:2016-11-24 04:31:03
【问题描述】:

这是生成的打字稿代码和相应的 JavaScript。 为什么微软选择使用 this.greeting 而不是使用 var 并在生成的 js 代码中隐藏变量以防止从外部访问?在打字稿中将属性更改为私有只会引发编译错误,但生成的js代码同上

//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'

【问题讨论】:

    标签: javascript typescript


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2013-01-31
        • 1970-01-01
        • 2015-12-11
        • 2014-07-14
        • 2016-05-30
        • 1970-01-01
        • 2017-02-17
        • 2012-08-03
        • 2011-01-09
        相关资源
        最近更新 更多