使用此JavaScript编码模式定义构造函数有什么好处?

nat*_*e75 9 javascript constructor anonymous-function function-prototypes module-pattern

我倾向于以下列方式编写对象构造函数:

function Person(name) {
    this.name = name;
}
Person.prototype.greet = function () {
    alert("Hello! My name is " + this.name + ".");
};
Run Code Online (Sandbox Code Playgroud)

我注意到一些JavaScript库和框架添加了一些额外的代码,如下所示:

var Person = (function () {
    function Person(name) {
        this.name = name;
    }
    Person.prototype.greet = function () {
        alert("Hello! My name is " + this.name + ".");
    };
    return Person;
})();
Run Code Online (Sandbox Code Playgroud)

我知道自执行匿名函数的作用和用途.我目前未能看到的是,在定义构造函数及其原型时,它提供了哪些优势或好处.

编辑#1:

我知道模块模式及其优点,并且在我的编码中经常使用它.我在沟通中的错误并不清楚我的第一个代码示例不应该在全球范围内.我总是将所有外部JavaScript文件包装在一个自执行的匿名函数中,以强制执行代码的本地范围.

例如:

;(function ( window, undefined ) {
    var p = function (name) {
        this.name;
    };
    p.prototype.greet = function () {
        alert("Hello! My name is " + this.name + ".");
    };
    window.Person = window.Person || p;
})(window);
Run Code Online (Sandbox Code Playgroud)

问题是我已经看到在我的第二个代码示例中显示的技术这样的匿名函数中使用.

例如:

;(function ( window, undefined ) {
    var p = (function () {
        var q = function (name) {
            this.name = name;
        };
        q.prototype.greet = function () {
            alert("Hello! My name is " + this.name + ".");
        };
        return q;
    })();
    window.Person = window.Person || p;
})(window);
Run Code Online (Sandbox Code Playgroud)

这是我对这项技术的重要性感到茫然的地方.

Rob*_*b W 1

第二种方法,即模块模式,更加可移植。请注意,您可以命名Person任何您想要的内容。

在第一种方法中,您必须跟踪 的每次出现Person,并在将构造函数+原型复制到另一个项目时小心不要意外删除该方法的一部分。

第二种方法有一个额外的优点:您可以使用本地/临时/一次性变量,这些变量可用于动态定义命名空间上的常量/方法/属性。