2

有人可以向我解释这个“构造函数”定义的优点是什么:

var Tree = (function () {
  function Tree(name) {
    this.name = name;
  }
  return Tree;
})();

代替

var Tree = function(name) {
   this.name = name;
};

第一个变体由 TypeScript 编译器生成。

4

3 回答 3

6

在 TypeScript 的情况下,还有额外的闭包用于捕获基类

class Animal {
    public run() {
        console.log('running!');
    }
}

class Giraffe extends Animal {
    public run() {
        super.run();
        console.log('... and looking awkward');
    }
}

发射:

var Animal = (function () {
    function Animal() {
    }
    Animal.prototype.run = function () {
        console.log('running!');
    };
    return Animal;
})();

var Giraffe = (function (_super) {
    __extends(Giraffe, _super);
    function Giraffe() {
        _super.apply(this, arguments);
    }
    Giraffe.prototype.run = function () {
        _super.prototype.run.call(this);
        console.log('... and looking awkward');
    };
    return Giraffe;
})(Animal);

注意通过传递给立即调用函数_super.prototype的参数(此处)引用基类的用法。Animal如果没有额外的闭包,就无法在不污染全局命名空间的情况下保存该值。

于 2013-08-15T22:13:41.640 回答
5

在这个具体的例子中,没有区别。如果您想在范围内保留一些变量,可能会有所不同:

var Tree = (function () {
  var greeting = "Hello ";
  function Tree(name) {
    this.firstname = greeting + name;
  }
  return Tree;
})();

此外,在这种情况下,无法修改greeting变量(实际上,它是私有的)。

于 2013-08-15T21:12:26.633 回答
2

该函数将被命名,这将在堆栈跟踪和调试工具中产生更有用的结果。

但是,您可以通过以下方式实现相同的效果:

function Tree(name) {
    this.name = name;
}

如果您简化了代码,那么您可能已经删除了可能创建类似于 Class 变量(在函数的所有实例之间共享的一段数据)的闭包的使用。

于 2013-08-15T21:09:59.923 回答