【发布时间】:2017-09-24 15:19:50
【问题描述】:
我在打字稿中添加了以下类
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 是私有的,该类的 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() 获取值,但我得到了 undefined。由于值已经在类的构造函数中分配,它应该可以通过 p.getVariable1() 获得
var p = new Person();
console.log(p.variable2); // undefined
p.variable2 = 'xyz1'; // setting value
console.log(p.variable2);// 'xyz1'
在上面的代码中,Variable2 应该返回 'xyz' 但它不是。一旦我给它赋值,它就会返回。
因此,私有变量和公共变量的行为在转译代码中是相同的,并且非常令人困惑。 它不返回在构造函数中分配的值。
【问题讨论】:
-
Javascript 没有私有变量。 Typescript 的私有变量只在编译时检查,这对开发很有用,但在运行时不提供保护。
-
我知道 javascript 不提供访问修饰符(保护或数据隐藏)的概念,但是有一种方法可以使用闭包实现数据隐藏,但是这里编译的代码没有实现适当的闭包以使变量公开和私人的。
-
是的,闭包可以使变量私有化,但这不是 typescript 的目标。 Typescript 提供编译时检查,仅此而已。
-
是否有理由需要在运行时进行检查?当您尝试访问
p.variable1时,IDE 或构建过程告诉您存在类型错误还不够吗? -
我在想浏览器理解什么,它理解编译后的 javascript,如果编译后的 javascript 不遵循相同的概念,那么在编译时将变量设为私有和公共有什么用。
标签: javascript typescript ecmascript-5 typescript2.0 tsc