该代码遵循什么设计模式?

时间:2018-12-18 07:02:21

标签: javascript design-patterns new-operator iife

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

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 <=>绑定,东西<=>扩展)

关于我的问题:

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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