JavaScript中的这种设计模式是什么?

时间:2010-09-07 18:55:12

标签: javascript

我正在查看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;
})();

中间的一些代码已被省略,但这应该给你一般的想法。

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

3 个答案:

答案 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已存在,则应删除旧值并重新初始化为空数组。