我在 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)的好处:
IDE 会立即告诉您您正在做一些不应该做的事情。如果您忽略这些错误,代码将编译为 JavaScript 并运行,但重点是您不要忽略这些错误。当你写出这样的糟糕代码时, typescript 会告诉你有问题,然后你就可以解决问题。如果您有构建过程,则可以对其进行设置,以便这些 typescript 错误将使构建失败,从而迫使您在部署之前修复问题。
Typescript 是一种工具,可以帮助您更早、更轻松地捕获错误,从而编写更好的 JavaScript 代码。它不是一个改变 javascript 工作方式的工具。 Typescript 不提供运行时类型检查,如果这就是您想要的,您将找不到它。如果您需要闭包来隐藏变量,请自己创建一个闭包。
关于javascript - 为什么类中的私有(private)变量在转译代码中被视为公共(public)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46391629/