Mir*_*pov 16 javascript ecmascript-5 iife typescript
这是一个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:
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并没有争论。它不能是闭包。
Pet*_*ter 12
在类之间存在继承的情况下,TypeScript会将参数传递给IIFE。例如,在Greeter扩展BaseGreeter类时使用下面的闭包:
var Greeter = /** @class */ (function (_super) {
    // __extends is added by the TS transpiler to simulate inheritance
    __extends(Greeter, _super);
    function Greeter(subject) {
        var _this = _super.call(this) || this;
        _this.subject = subject;
        return _this;
    }
    Greeter.What = function () {
        return "Greater";
    };
    Greeter.prototype.greet = function () {
        return "Hello, " + this.subject;
    };
    return Greeter;
}(BaseGreeter));
art*_*tem 11
这样做是为了在此类极端情况下保留本机类的行为,在这种情况下,有人尝试Greeter在定义类之前使用它:
// this is javascript code, not TypeScript
console.log(Greeter.What());
class Greeter {
}
Greeter.What = function What() {
    return "Greater";
}
使用本机类实现时,应打印ReferenceError: Greeter is not defined。
当在IIFE中转堆和包装时,结果足够接近:TypeError: Cannot read property 'What' of undefined。
如果没有IIFE,解开功能悬挂和名称Greeter的范围是它的定义之前,因此产生了不同的错误:TypeError: Greeter.What is not a function
请注意,IIFE不用于隐藏私有实例或类属性,因为无论如何都不需要。进行编译时,实例属性被分配为this构造函数内部的属性,而静态属性被分配为Greeter对象的属性-不创建任何变量。