这里是一个TypeScript类:
class Greeter {
public static what(): string {
return "Greater";
}
public subject: string;
constructor(subject: string) {
this.subject = subject;
}
public greet(): string {
return "Hello, " + this.subject;
}
}
它在TS目标为ES5时被转译为IIFE:
它在TS目标为ES5时被转译为IIFE:
var Greeter = /** @class */ (function () {
function Greeter(subject) {
this.subject = subject;
}
Greeter.what = function () {
return "Greater";
};
Greeter.prototype.greet = function () {
return "Hello, " + this.subject;
};
return Greeter;
}());
然而,当它作为构造函数呈现时,它通常以同样的方式工作。当然,这看起来更像JavaScript和手写代码 :)
function Greeter(subject) {
this.subject = subject;
}
Greeter.what = function () {
return "Greater";
};
Greeter.prototype.greet = function () {
return "Hello, " + this.subject;
};
使用方法:
这两个代码块的工作方式相同:
Greater.what(); // -> "Greater"
var greater = new Greater("World!");
greater.greet(); // -> "Hello, World!
将代码封装在IIFE中有什么好处或动机?
我做了一个简单的基准测试:
console.time("Greeter");
for(let i = 0; i < 100000000; i++) {
new Greeter("world" + i);
}
console.timeEnd("Greeter");
它显示出几乎相同的实例化速度。当然,我们不能期望有任何区别,因为IIFE仅被解析一次。
我在想也许是因为闭包,但是IIFE没有带参数。这一定不是一个闭包。