我最近遇到了以下模式:
/* PATTERN 1 */
(function(window) {
var Stuff = (function() { // Variable assignment and self-invoking anonymous function
function Stuff(params) {
this.items = [];
}
Stuff.prototype = {
someMethod1: function() {
},
someMethod2: function() {
}
};
return Stuff;
}()); // END Variable assignment
Stuff.create = function(params) {
return new Stuff(params);
};
window.Stuff = Stuff;
}(window));
让我困惑的是分配Stuff
变量所起的作用。具体来说,此模式在操作上与以下模式有何不同:
/* PATTERN 2 */
(function(window) {
// No variable assignment or self-invoking anonymous function
function Stuff(params) {
this.items = [];
}
Stuff.prototype = {
someMethod1: function() {
},
someMethod2: function() {
}
};
Stuff.create = function(params) {
return new Stuff(params);
};
window.Stuff = Stuff;
}(window));
模式1的原型方法的范围在某种程度上是私有的,而模式2的原型方法不是?这纯粹是为了更清晰地分离业务逻辑的一种风格方法吗?
完全没有区别。内部IIFE是完全没有意义的,因为它没有任何局部变量,可以安全地省略。唯一(一点)不同的是,外部IIFE中的Stuff
现在是一个函数声明,而不是一个赋值给变量的函数。
当然,就其现状而言,外部的IEFE也相当无用,除了可能用于代码组织。
这两种模式都允许您轻松地创建附加到Stuff "类"上的真正私有变量,但不能在它之外访问:
var Stuff = (function() { // Variable assignment and self-invoking anonymous function
var stuff_private = "stuff";
function Stuff(params) {
this.items = [];
}
Stuff.prototype = {
someMethod1: function() {
},
someMethod2: function() {
}
getStuff: function() {
return stuff_private;
}
};
return Stuff;
}()); // END Variable assignment
stuff_private
现在嵌入在Stuff的范围内,但它对外部世界是不可见的。您也可以在第二种模式中这样做,但是如果您在同一个文件中创建多个类,每个类都有自己的私有变量,那么第一种模式可能是有意义的。