ser*_*0ne 2 javascript compiler-construction class access-modifiers typescript
在我继续之前,我想指出我已经问了一些关于 TypeScript、它的编译器以及它在其生命周期中已经实现和没有实现的问题以及 1.0 版的路线图
这个问题与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");
Run Code Online (Sandbox Code Playgroud)
现在,当我输入example. 智能感知 ( 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");
Run Code Online (Sandbox Code Playgroud)
现在,如果我将此示例粘贴到我的浏览器控制台(我使用的是 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");
Run Code Online (Sandbox Code Playgroud)
现在,如果我将此示例粘贴到我的浏览器控制台中,我只能访问messageBand showMessageA,根据我尝试使用 TypeScript 实现的目标是正确的。
问题
使用闭包来模仿私有访问的问题是每个实例都需要每个方法的自己的副本。这意味着每次创建实例时,都必须编译每个方法函数,并且必须为新函数保留内存空间。这并不理想,也不是 TypeScript 试图实现的目标。