【问题标题】:What design pattern is this code adhering to?这段代码遵循什么设计模式?
【发布时间】:2019-05-18 13:34:23
【问题描述】:

在探索我感兴趣的JavaScript library 时,我遇到了这个奇怪的 IIFE。我找不到有关此模式的任何信息,因此我相信它是为这个用例量身定制的。我不能完全理解这里发生的事情,但直觉让我认为它可能类似于单例模式。这是一个简短的示例,展示了我认为是代码的核心:

var Ctor = (function () {

  function dostuff(_this, args...){}//only used within this iife

  var Ctor = function (args...) {
    if (!this || this === window) {
      return new Ctor(args...);
    }
    dostuff(this, args...);
    return this;
  };
  return Ctor;
})();

请注意,我更改了函数的名称以反映我认为它们负责的内容,但我的假设可能是错误的,并且我可能会进一步使代码难以理解。我链接到的源代码大约有 60 行,所以如果这个版本没有意义,我建议你看看提示。 (我所做的更改是 Ctor Bind,dostuff extend)

至于我的问题:

  1. 这是什么设计模式? (如果适用)
  2. 使用这种模式的灵感是什么?
  3. 此模式还有哪些其他实际应用?
  4. 是否有更标准/更易读的编写方式来产生相同的功能?

【问题讨论】:

标签: javascript design-patterns new-operator iife


【解决方案1】:

在花了一些时间试图弄清楚代码的确切性质之后,我发现了它的实际用途。从这里开始,谷歌搜索问题变得更加容易,我立即找到了This Post。以下是我对我的问题提出的答案。随时更正其中的任何内容或添加到讨论中!

  1. 这是一种创建模式,可以在实例化新对象时抽象出使用“new”的需要
  2. 您不必担心键入 new,使语法更简单(但可能更令人困惑)
  3. JQuery 实际上使用了与此非常相似的模式!谁会想到!每次使用 $(...) 时,都会应用此模式
  4. 这似乎是尝试完成此功能的最建议(?)方式,但This Post 建议以下代码是等效的(并且更易于理解):

    var Ctor = function(args){
      var obj = function(args){
        this.foo = bar
      };
      return new obj();
    };
    

    至于您为什么要使用不太清晰的版本,我不太确定。我能看到的唯一重大区别是,在第一个版本中,您创建的是一个 Ctor 对象,而在第二个版本中,您是创建一个 obj 对象。第一个版本中少了一个函数定义,也许还有一些我还没有看到的其他好处。然而,知道这两种模式是等价的,可以让我更好地理解第一种模式是如何工作的。

【讨论】:

  • Ctor 中创建var obj = function(args){ this.foo = bar } 确实效率低下。放在外面。如果您愿意,可以在 IIFE 中。
  • 使Ctor 成为构造函数本身的好处是Ctor() instanceof Ctor。不过,您可以通过不同的方式实现这一目标,例如following the jQuery pattern.
  • @bergi 感谢您如此参与这个问题;我最终使用了这样的东西:var Ctor = function(args){ if(!this || this === window) return new Ctor(args); function privateConstructor(args){/*...*/}; privateConstructor(args) return this; }(对废话格式感到抱歉..),无论如何,我认为在这种情况下 Ctor() instanceof Ctor 是正确的,没有单独的嵌套类,也没有 IIFE。
猜你喜欢
  • 2013-02-10
  • 2019-09-18
  • 2011-01-16
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
相关资源
最近更新 更多