【发布时间】:2014-01-17 06:55:37
【问题描述】:
在我继续之前,我想指出我已经问了一些关于 TypeScript、它的编译器以及它在其整个生命周期中已经实现和无法实现的目标以及通向 1.0 版的路线图的一些问题 em>
这个问题与 TypeScript 中 public 和 private 关键字的使用有关,以及它们与编译后的 JavaScript 有何关系。
考虑以下 TypeScript 类:
class Example {
private messageA: string;
public messageB: string;
constructor(message?: string) {
this.messageA = "private: " + message;
this.messageB = "public: " + message;
}
public showMessageA(): void {
alert(this.messageA);
}
private showMessageB(): void {
alert(this.messageB);
}
}
var example = new Example("Hello World");
现在,当我输入 example 时。 intellisense (TypeScript) 告诉我我可以访问messageB 和showMessageA,因为它们都是public。但是,这种行为(虽然可能)在编译后的 JavaScript 中并不明显。
这是我的班级的 JavaScript 编译:
var Example = (function () {
function Example(message) {
this.messageA = "private: " + message;
this.messageB = "public: " + message;
}
Example.prototype.showMessageA = function () {
alert(this.messageA);
};
Example.prototype.showMessageB = function () {
alert(this.messageB);
};
return Example;
})();
var example = new Example("Hello World");
现在,如果我将此示例粘贴到我的浏览器控制台(我使用的是 Chrome),我可以访问 messageA、messageB、showMessageA、showMessageB,这意味着在 JavaScript 中,所有访问修饰符都是忽略。
我个人认为这是错误的! JavaScript 能够对访问修饰符进行建模,因此我认为 TypeScript 应该效仿。
考虑以下手写 JavaScript,它正确地模拟了 private 和 public 变量和函数:
var Example = (function() {
return function Example(message) {
var messageA = "private: " + message;
this.messageB = "public: " + message;
this.showMessageA = function() {
alert(messageA);
}
var showMessageB = function() {
alert(this.messageB);
}
}
})();
var example = new Example("Hello World");
现在,如果我将此示例粘贴到我的浏览器控制台中,我只能访问 messageB 和 showMessageA,根据我尝试使用 TypeScript 实现的目标是正确的。
问题
- 为什么 TypeScript 编译器在编译成 JavaScript 时会忽略访问修饰符?
- 为什么 TypeScript 将所有方法绑定到原型,而不是基于每个实例?
- 如果 TypeScript 编译类的方式与我的自定义实现相比有什么好处,那是什么,为什么?
【问题讨论】:
-
1) 已解决 2) 和 3) 语言作者的设计决策。 TypeScript 是关于开发人员体验的,因此,如果您使用 TypeScript,您将不会调用任何私有函数,因为编译器会阻止它。
prototype方式不需要关闭。
标签: javascript class compiler-construction typescript access-modifiers