javascript - 这种设计模式在 JavaScript 中称为什么?

标签 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 })(); 这是我见过的模块模式吗?这是为了保持全局 namespace 的清洁吗?
  2. 这行是什么意思?:var self = {} self 对象是否用于公开“公共(public)”成员?您将如何定义私有(private)函数或变量?
  3. 如果愿意,您将如何实例化多个“Boards”?

最佳答案

它被称为模块模式。

函数两边的括号意味着它在定义后立即被求值——所以本质上它是一个Singleton。由于它是一个匿名函数,因此不会存储定义 - 因此您无法在不进行一些修改的情况下轻松创建此对象的新实例(稍后将讨论)。

你是对的,self 可以说包含了“公共(public)”方法和属性。由于闭包属性,任何未在 self 中定义的变量对外部都是不可见的。但是,在 self 中定义的任何函数仍然可以访问私有(private)变量,因为在 Javascript 中,函数保持对定义它们的上下文(包括变量)的访问——除了少数异常(exception)。主要是 argumentsthis

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

关于javascript - 这种设计模式在 JavaScript 中称为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3661725/

相关文章:

javascript - 屏蔽没有 type=password 的输入字符

不匹配数字、空格和选定符号的 JavaScript 正则表达式

javascript - 如何将 javascript regexp 中的 Euro € 符号与八进制、十六进制或 unicode 元字符匹配?

javascript - 使用搜索查询过滤数据? WordPress JSON 对象 + VueJS2

javascript - jquery 开启。 ('click' )不再适用于调用数据表的新方法

javascript - 在数组中搜索对象属性,然后隐藏第一次出现的找到的对象

javascript - javascript 中同步函数执行的问题

javascript - 使用复选框删除行?

javascript - 使用 jQuery 更新 XML 字符串

javascript - Angular [innerHTML] 无法正常工作