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

Mit*_*rax 7 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;
})();
Run Code Online (Sandbox Code Playgroud)

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

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

Cri*_*hez 11

它被称为模块模式.

函数周围的括号表示它在被定义后立即被评估 - 所以本质上它是一个单例.由于它是一个匿名函数,因此不会存储定义 - 因此您无法轻松创建此对象的新实例而无需进行一些修改(稍后将对此进行讨论).

你是对的,self 包含"公共"方法和属性.self由于闭包属性,任何未定义的变量对外部都不可见.但是,定义的任何函数self仍然可以访问私有变量,因为在Javascript中,函数维护对定义它们的上下文(包括变量)的访问 - 除了少数例外..主要argumentsthis.

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