理解Typescript编译器生成的Javascript

理解Typescript编译器生成的Javascript,javascript,typescript,Javascript,Typescript,如果我键入以下简单的typescript代码: class Point2D { constructor(public x: number, public y: number) { } } 看看生成的js: var Point2D = (function () { function Point2D(x, y) { this.x = x; this.y = y; } return Point2D; })(); 我的

如果我键入以下简单的typescript代码:

class Point2D
{
    constructor(public x: number, public y: number)
    {
    }
} 
看看生成的js:

var Point2D = (function () {
    function Point2D(x, y) {
        this.x = x;
        this.y = y;
    }
    return Point2D;
})();
我的问题:上述内容与以下内容有何不同:

function Point2D(x, y) {
    this.x = x;
    this.y = y;
}
如果没有区别,那么上面就简单多了

您看到的是设计模式-模块。请参阅此处的更多信息:

  • (本·切里撰稿)
引用:

模块导出

有时,您不仅想使用全局变量,还想声明它们。通过使用匿名函数的返回值导出它们,我们可以很容易地做到这一点。这样做将完成基本模块模式,下面是一个完整的示例:

请注意,我们已经声明了一个名为module的全局模块,它有两个公共属性:一个名为module.moduleMethod的方法和一个名为module.moduleProperty的变量。此外,它使用匿名函数的闭包来维护私有内部状态。此外,我们可以使用上面学习的模式轻松导入所需的全局变量

另一个真正重要的资源是:

  • (艾迪·奥斯马尼的书)
引用:

模块模式 在JavaScript中,模块模式用于进一步模拟类的概念,这样我们就能够在单个对象中包含公共/私有方法和变量,从而屏蔽全局范围内的特定部分。这将减少函数名与页面上其他脚本中定义的其他函数冲突的可能性


请参阅链接中的更多内容。之所以这样计算它,是因为JavaScript的功能性质和被转换代码的类性质。 typescript正试图尽可能准确地转换代码,因为Javascript是无类的。它编写代码来模拟一个类,当然,类模拟并不是实现所需结果的最有效方法,但已被证明对于具有基于类的背景的程序员来说更具可读性。另外,虽然有多种方法可以在JavaScript中实现所需的结果,但它被转录的方式最准确地表示了它所提供的源代码,因为它确实基于一个类。 至于区别,生成的代码使用构造函数创建一个对象,然后使用该对象创建基于它的对象。这就是为什么您最终能够像类一样使用它,因为您使用它创建的对象将继承自它,就像您正在转换的语言中的类一样。您提供的函数仅在调用时将值分配给自身,因为生成的代码将创建包含该功能的对象。 为了进一步澄清:您的函数将像这个Point2D(5,4)一样使用,这里还值得指出的是,在JavaScript中,使用大写字母命名对象是按照惯例保留的,仅用于构建的对象,如代码生成的对象,在使用时预期使用“new”方法。 生成的代码的使用方式如下:pointA=newpoint2d(5,4)。 因为代码返回函数Point2D,并在那时使用()调用它,所以pointA成为Point2D的一个实例,它的行为再次类似于一个类。此外,如果要向Point2D添加任何属性、函数等,则无论是否已实例化,pointA也会自动拾取这些属性、函数等。
希望这能为您澄清问题,还有其他不同之处,但不清楚您希望获得多少信息。

使用IIFE的主要原因是继承。请看,您可能希望在您的帖子中应用一些内容(请!)
var MODULE = (function () {
    var my = {},
        privateVariable = 1;

    function privateMethod() {
        // ...
    }

    my.moduleProperty = 1;
    my.moduleMethod = function () {
        // ...
    };

    return my;
}());