2010-09-07 43 views
7

我正在查看关于Scrabb.ly的js源代码。这种设计模式在JavaScript中被称为什么?

我注意到,他们会做一些像这样每个其独特的“类”的:

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; 
})(); 

从中间被省略了一些代码,但是这应该给你的总体思路。

  1. 以下是什么目的:(function() { // code })();这是我见过的模块模式吗?这是否意味着保持全局名称空间清洁?
  2. 这行是什么意思?:var self = {}自我对象是用来暴露“公共”成员吗?你将如何定义一个私有函数或变量?
  3. 如果你想要如何实例化多个“Boards”?

回答

11

它被称为模块模式。

功能周围的括号意味着它被定义后立即进行评估 - 所以本质上它是一个Singleton。由于它是一个匿名函数,所以定义不会被存储 - 所以你不能轻易地创建这个对象的新实例,而不做一些修改(这将在后面讨论)。

你是对的,self包含“public”方法和属性,就像它一样。由于封闭属性,任何在self中未定义的变量都不可见。然而,在self中定义的任何函数仍然可以访问私有变量,因为在Javascript中,函数保持对定义它们的上下文(包括变量)的访问 - 除少数例外,主要是argumentsthis

如果要定义此对象的多个实例,请删除括号(var Board = function() { ... }),然后使用var obj = Board()创建一个对象。请注意,它不使用new运算符。

4

由于mentioned in the other answer,这就是模块模式。

它也被称为YUI模块模式或雅虎模块模式,主要是因为它是这个博客文章而流行:

关于第3点,模块模式旨在成为一个单身人士。但是,模块模式很容易转换为构造器模式。你可能想看看通过Douglas Crockford下面的介绍有关更多信息,关于这个主题:

1

var self = {}应该有初始化自己的影响为空对象字面;如果self已经存在,它应该删除旧值并重新初始化为一个空数组。

+1

我认为你的意思是“对象”而不是“数组”? – 2010-09-07 19:23:08

+0

@Daniel Vassallo:应该说“对象字面量”,好抓。 – 2010-09-07 19:48:33