【发布时间】:2012-03-07 07:28:27
【问题描述】:
我倾向于用以下方式编写对象构造函数:
function Person(name) {
this.name = name;
}
Person.prototype.greet = function () {
alert("Hello! My name is " + this.name + ".");
};
我注意到一些 JavaScript 库和框架添加了一些额外的代码,如下所示:
var Person = (function () {
function Person(name) {
this.name = name;
}
Person.prototype.greet = function () {
alert("Hello! My name is " + this.name + ".");
};
return Person;
})();
我知道自动执行匿名函数的作用和用途。我目前看不到的是在定义构造函数及其原型时它提供了哪些优势或好处。
编辑#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);
问题是我已经看到我的第二个代码示例中显示的技术在in这样的匿名函数中使用。
例如:
;(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);
这就是我对这项技术的重要性感到茫然的地方。
【问题讨论】:
-
在这个具体的例子中,没有区别。我认为对于更复杂的类,这可能很重要,这取决于框架在额外范围内做什么。
-
@Domenic - 你的答案与我希望的答案一致。我想知道是否有人可以对此进行详细说明。
标签: javascript constructor anonymous-function function-prototypes module-pattern