我正在查看Scrabb.ly的js源代码。
我注意到他们会为每个不同的“类”做同样的事情:
var Board = (function() {
var self = {};
// settings for board
self.options = {
debug: true,
addedPlayTiles: function() {},
clearedPlayTiles: function() {}
};
// set to true once the board has been setup
self.isSetup = false;
// quick access to square elements
self.squares = {};
self.squareCount = 0;
self.setup = function(options) {
self.log("Setting up board!");
// set options
_.each(options, function(val, key) {
self.options[key] = val;
});
return self;
})();
中间的一些代码已被省略,但这应该给你一般的想法。
(function() { // code })();
这是我见过的模块模式吗?这是否意味着保持全局命名空间的清洁?var self = {}
自我对象是否用于暴露“公共”成员?您将如何定义私有函数或变量?答案 0 :(得分:11)
它被称为模块模式。
函数周围的括号表示它在被定义后立即被评估 - 所以实质上它是 Singleton 。由于它是一个匿名函数,因此不会存储定义 - 因此您无法轻松创建此对象的新实例(如稍后所述)。
你是对的,self
包含“公共”方法和属性。由于闭包属性,任何未在self
中定义的变量都不会被外部看到。但是,self
中定义的任何函数仍然可以访问私有变量,因为在Javascript中,函数维护对定义它们的上下文(包括变量)的访问 - 除少数例外..主要是{{1} }和arguments
。
如果要定义此对象的多个实例,则应删除括号(this
),然后使用var Board = function () { ... }
创建对象。请注意,它不使用var obj = Board()
运算符。
答案 1 :(得分:4)
作为mentioned in the other answer,那就是模块模式。
它也被称为YUI模块模式或雅虎模块模式,主要是因为它受到这篇博客文章的欢迎:
关于第3点,模块模式旨在成为单身人士。但是,模块模式很容易转换为构造函数模式。您可能需要Douglas Crockford查看以下演示文稿,了解有关此主题的更多信息:
答案 2 :(得分:1)
var self = {}
应该具有将self初始化为空对象文字的效果;如果self已存在,则应删除旧值并重新初始化为空数组。