вопрос об одиночном элементе JavaScript

Я просто считал несколько потоков на обсуждении одноэлементного дизайна в JavaScript. Я на 100% плохо знаком с материалом Шаблона разработки, но как я вижу, так как Singleton по определению не будет иметь потребности, которая инстанцируют, концептуально если это нельзя инстанцировать, по-моему, это нельзя рассматривать как стандартные объекты, которые создаются из проекта (классы). Таким образом, мое удивление состоит в том, почему не только думают об одиночном элементе так же, как о чем-то статически доступном, которое обертывается в своего рода объем, и это должно быть всеми.

От потоков я видел, большинство из них делает одиночный элемент хотя традиционный JavaScript

new function(){} 

сопровождаемый путем создания псевдо конструктора.

Хорошо я просто думаю, что литерал объектов достаточно достаточно:

var singleton = {
   dothis: function(){},
   dothat: function(){}
}

право? Или кто-либо получил лучшее понимание?

[обновление]: Снова моя точка - то, почему люди только не используют более простой способ сделать одиночные элементы в JavaScript, когда я показал во втором отрывке, если существует абсолютная причина, скажите мне. Я обычно боюсь этого вида ситуации, что я упрощаю вещи до очень: D

19
задан Shawn 13 December 2009 в 05:41
поделиться

7 ответов

Я согласен с вами, самый простой способ - использовать объект буквально, но если вы хотите private членов, вы можете реализовать, используя closures:

var myInstance = (function() {
  var privateVar;

  function privateMethod () {
    // ...
  }

  return { // public interface
    publicMethod1: function () {
      // private members can be accessed here
    },
    publicMethod2: function () {
      // ...
    }
  };
})();

О конструкции new function(){}, она будет просто использовать анонимную функцию в качестве конструктора функции, контекст внутри этой функции будет новым объектом, который будет возвращен.

Edit: В ответ на комментарий @J5, это просто сделать, на самом деле я думаю, что это может быть хорошим примером использования шаблона Lazy Function Definition:

function singleton() {
  var instance = (function() {
    var privateVar;

    function privateMethod () {
      // ...
    }

    return { // public interface
      publicMethod1: function () {
          // private members can be accessed here
       },
      publicMethod2: function () {
        // ...
      }
    };
  })();

  singleton = function () { // re-define the function for subsequent calls
    return instance;
  };

  return singleton(); // call the new function
}

Когда функция вызывается в первый раз, я делаю экземпляр объекта, и переназначаю singleton на новую функцию, которая имеет этот экземпляр объекта в своем закрытии.

Перед завершением первого вызова я выполняю переопределённую функцию singleton, которая вернёт созданный экземпляр.

После вызова функции singleton просто возвращает экземпляр instance, который хранится в его закрытии, потому что новая функция является той, которая будет выполнена.

Вы можете доказать, что при сравнении возвращаемого объекта:

singleton() == singleton(); // true

Оператор == для объектов вернет true только в том случае, если объект reference обоих операндов одинаков, он вернет false, даже если объекты идентичны, но это два разных экземпляра:

({}) == ({}); // false
new Object() == new Object(); // false
31
ответ дан 30 November 2019 в 03:25
поделиться

Одноэлементный шаблон реализуется путем создания класса с методом, который создает новый экземпляр класса, если он не существует. Если экземпляр уже существует, он просто возвращает ссылку на этот объект. 1

(function (global) {

     var singleton;

     function Singleton () {
         // singleton does have a constructor that should only be used once    
         this.foo = "bar";
         delete Singleton; // disappear the constructor if you want
     }

     global.singleton = function () {
         return singleton || (singleton = new Singleton());
     };

})(window);

var s = singleton();
console.log(s.foo);

var y = singleton();
y.foo = "foo";
console.log(s.foo);

Вы не просто объявляете синглтон как объект, потому что он создает его экземпляр, он не объявляет его. Он также не предоставляет механизма для кода, который не знает о предыдущей ссылке на синглтон для его получения. Синглтон - это не объект / класс, возвращаемый синглтоном, это структура. Это похоже на то, как закрытые переменные не являются замыканиями, область действия функции, обеспечивающая замыкание, является замыканием.

Если экземпляр уже существует, он просто возвращает ссылку на этот объект. 1

(function (global) {

     var singleton;

     function Singleton () {
         // singleton does have a constructor that should only be used once    
         this.foo = "bar";
         delete Singleton; // disappear the constructor if you want
     }

     global.singleton = function () {
         return singleton || (singleton = new Singleton());
     };

})(window);

var s = singleton();
console.log(s.foo);

var y = singleton();
y.foo = "foo";
console.log(s.foo);

Вы не просто объявляете синглтон как объект, потому что он создает его экземпляр, он не объявляет его. Он также не предоставляет механизма для кода, который не знает о предыдущей ссылке на синглтон для его получения. Синглтон - это не объект / класс, возвращаемый синглтоном, это структура. Это похоже на то, как закрытые переменные не являются замыканиями, область действия функции, обеспечивающая замыкание, является замыканием.

Если экземпляр уже существует, он просто возвращает ссылку на этот объект. 1

(function (global) {

     var singleton;

     function Singleton () {
         // singleton does have a constructor that should only be used once    
         this.foo = "bar";
         delete Singleton; // disappear the constructor if you want
     }

     global.singleton = function () {
         return singleton || (singleton = new Singleton());
     };

})(window);

var s = singleton();
console.log(s.foo);

var y = singleton();
y.foo = "foo";
console.log(s.foo);

Вы не просто объявляете синглтон как объект, потому что он создает его экземпляр, он не объявляет его. Он также не предоставляет механизма для кода, который не знает о предыдущей ссылке на синглтон для его получения. Синглтон - это не объект / класс, возвращаемый синглтоном, это структура. Это похоже на то, как закрытые переменные не являются замыканиями, область действия функции, обеспечивающая замыкание, является замыканием.

Синглтон - это не объект / класс, возвращаемый синглтоном, это структура. Это похоже на то, как закрытые переменные не являются замыканиями, область действия функции, обеспечивающая замыкание, является замыканием.

Синглтон - это не объект / класс, возвращаемый синглтоном, это структура. Это похоже на то, как закрытые переменные не являются замыканиями, область действия функции, обеспечивающая замыкание, является замыканием.

1
ответ дан 30 November 2019 в 03:25
поделиться

Я тоже об этом думал, но мне кажется разумным просто определение объекта с функциями в нем. Нет смысла создавать конструктор, который никто никогда не должен вызывать, для создания объекта без прототипа, когда вы можете просто определить объект напрямую.

С другой стороны, если вы хотите, чтобы ваш синглтон был экземпляром некоторого существующего " class "- то есть вы хотите, чтобы у него был какой-то другой объект в качестве прототипа - тогда вам do нужно использовать функцию конструктора, чтобы вы могли установить его свойство prototype прежде чем его вызвать.

1
ответ дан 30 November 2019 в 03:25
поделиться

Последнее окно кода показывает то, что разработчики JS называют своей версией объектно-ориентированного дизайна в Javascript.

Сингетоны должны быть единичными объектами, которые не могут быть построены (за исключением, я полагаю, исходного определения. У вас есть один глобальный экземпляр одиночного объекта.

0
ответ дан 30 November 2019 в 03:25
поделиться

Я использовал вторую версию ( var singleton = {}; ) для всего, от расширений Firefox до веб-сайтов, и работает очень хорошо. Хорошая идея - определять элементы не внутри фигурных скобок, а за их пределами, используя имя объекта, например:

var singleton = {};
singleton.dothis = function(){

};
singleton.someVariable = 5;
3
ответ дан 30 November 2019 в 03:25
поделиться

Возможно, вы сможете использовать PDOStatement-> debugDumpParams . См. документацию PHP .

Вы можете объявить локальные переменные внутри функции, которые доступны внутри любых вложенных функций, но не из глобальной области.

На самом деле есть два способа сделать это. Вы можете вызвать функцию с помощью new , как в вашем примере, или просто вызвать функцию напрямую. Есть небольшие различия в том, как вы пишете код, но они по сути эквивалентны.

Ваш второй пример может быть записан следующим образом:

var singleton = new function () {
    var privateVariable = 42; // This can be accessed by dothis and dothat

    this.dothis = function () {
        return privateVariable;
    };

    this.dothat = function () {};
}; // Parentheses are allowed, but not necessary unless you are passing parameters

или

var singleton = (function () {
    var privateVariable = 42; // This can be accessed by dothis and dothat

    return {
        dothis: function () {
            return privateVariable;
        },

        dothat: function () {}
    };
})(); // Parentheses are required here since we are calling the function

Вы также можете передавать аргументы любой функции (вам потребуется добавьте круглые скобки к первому примеру).

0
ответ дан 30 November 2019 в 03:25
поделиться

Крокфорд (кажется) согласен с тем, что литерал объекта - это все, что вам нужно для синглтона в JavaScript:

http://webcache.googleusercontent.com/search?q=cache:- j5RwC92YU8J: www.crockford.com/codecamp/The%2520Good%2520Parts%2520ppt/5%2520functional.ppt+singleton+site: www.crockford.com & cd = 1 & hl = en & ct = clnk

0
ответ дан 30 November 2019 в 03:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: