我正在查看 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 })();
这是我见过的模块模式吗?这是为了保持全局 namespace 的清洁吗? - 这行是什么意思?:
var self = {}
self 对象是否用于公开“公共(public)”成员?您将如何定义私有(private)函数或变量? - 如果愿意,您将如何实例化多个“Boards”?
最佳答案
它被称为模块模式。
函数两边的括号意味着它在定义后立即被求值——所以本质上它是一个Singleton。由于它是一个匿名函数,因此不会存储定义 - 因此您无法在不进行一些修改的情况下轻松创建此对象的新实例(稍后将讨论)。
你是对的,self
可以说包含了“公共(public)”方法和属性。由于闭包属性,任何未在 self
中定义的变量对外部都是不可见的。但是,在 self
中定义的任何函数仍然可以访问私有(private)变量,因为在 Javascript 中,函数保持对定义它们的上下文(包括变量)的访问——除了少数异常(exception)。主要是 arguments
和 this
。
如果你想定义这个对象的多个实例,你会删除括号 (var Board = function () { ... }
) 然后使用 var obj = Board( )
创建一个对象。请注意,它不使用 new
运算符。
关于javascript - 这种设计模式在 JavaScript 中称为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3661725/