Вот класс 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;
}
}
Он переносится в IIFE, когда TS нацеливается на ES5:
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;
}());
Тем не менее, он обычно работает таким же образом, когда он представлен как функция конструктора. Который, конечно, выглядит более JavaScriptish и рукописный :)
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 не принимает аргументы. Это не должно быть закрытием.