理解Typescript编译器生成的Javascript
如果我键入以下简单的typescript代码:理解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; })(); 我的
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;
}
如果没有区别,那么上面就简单多了您看到的是设计模式-模块。请参阅此处的更多信息:
- (本·切里撰稿)
- (艾迪·奥斯马尼的书)
请参阅链接中的更多内容。之所以这样计算它,是因为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;
}());