javascript - 为什么类中的私有(private)变量在转译代码中被视为公共(public)变量

标签 javascript typescript ecmascript-5 typescript2.0 tsc

我在 typescript 中添加了以下类

class Person {
    private variable1;
    public varibele2;

    Person(){
        this.variable1 = 'abc';
        this.varibele2 = 'xyz'; 
    }

    public getVariable1(){
        return this.variable1;        
    }
}

所以当我使用 tsc 编译代码时,它会生成以下代码

var Person =  (function () {
    function Person() {
    }
    Person.prototype.Person = function () {
        this.variable1 = 'abc';
        this.varibele2 = 'xyz';
    };
    Person.prototype.getVariable1 = function () {
        return this.variable1;
    };
    return Person;
}());

由于variable1是私有(private)的,该类的obj不应访问(这发生在 typescript 代码中)。

相同的行为应该发生在转译的 es5 代码中(但没有发生)。

在上面示例的转译代码中,我正在创建 Person 的对象

var p = new Person();
console.log(p.variable1); // undefined 
p.variable1 = 'abc1';  // setting value to variable 1 
console.log(p.variable1); // 'abc1'
console.log(p.getVariable1()); // 'abc1'

在上面的代码中,我应该无法设置或获取variable1的值。

var p = new Person();
console.log(p.getVariable1()); // 'undefined' 
p.variable1 = 'abc1';  // setting value to variable1 
console.log(p.getVariable1()); // 'abc1'

在上面的代码中,我尝试使用 p.getVariable1() 获取值,但结果未定义。由于值已在类的构造函数中分配,因此应该可以通过 p.getVariable1() 获取该值

var p = new Person();
console.log(p.variable2); // undefined
p.variable2 = 'xyz1'; // setting value
console.log(p.variable2);// 'xyz1'

在上面的代码中,Variable2 应该重新运行“xyz”,但事实并非如此。一旦我给它赋值,它就会返回。

因此,私有(private)变量和公共(public)变量的行为在转译代码中是相同的,这非常令人困惑。 它不返回在构造函数中分配的值。

最佳答案

为了继续我们的评论讨论,以下是使用公共(public)与私有(private)的好处:

example of typescript errors

IDE 会立即告诉您您正在做一些不应该做的事情。如果您忽略这些错误,代码将编译为 JavaScript 并运行,但重点是您不要忽略这些错误。当你写出这样的糟糕代码时, typescript 会告诉你有问题,然后你就可以解决问题。如果您有构建过程,则可以对其进行设置,以便这些 typescript 错误将使构建失败,从而迫使您在部署之前修复问题。

Typescript 是一种工具,可以帮助您更早、更轻松地捕获错误,从而编写更好的 JavaScript 代码。它不是一个改变 javascript 工作方式的工具。 Typescript 不提供运行时类型检查,如果这就是您想要的,您将找不到它。如果您需要闭包来隐藏变量,请自己创建一个闭包。

关于javascript - 为什么类中的私有(private)变量在转译代码中被视为公共(public)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46391629/

相关文章:

angular - Jest : mock RxJs pipe

JavaScript 嵌套函数

javascript - Google 分析代码和带有 php header 位置的重定向

javascript - 如何使用 Angular js 将选择下拉列表中的值填充为默认值

javascript - es5-shim 和 underscore.js?

javascript - 如何理解 JS 领域

javascript - 为什么函数声明会覆盖全局对象的不可写属性?

javascript - Webpack 4 不按顺序加载页面

visual-studio - Visual Studio 认为一切都是 TypeScript 资源

angular - 获取错误对象(...)的 Ionic App Availability 插件不是函数