2010-09-07 40 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