Я просто считал несколько потоков на обсуждении одноэлементного дизайна в JavaScript. Я на 100% плохо знаком с материалом Шаблона разработки, но как я вижу, так как Singleton по определению не будет иметь потребности, которая инстанцируют, концептуально если это нельзя инстанцировать, по-моему, это нельзя рассматривать как стандартные объекты, которые создаются из проекта (классы). Таким образом, мое удивление состоит в том, почему не только думают об одиночном элементе так же, как о чем-то статически доступном, которое обертывается в своего рода объем, и это должно быть всеми.
От потоков я видел, большинство из них делает одиночный элемент хотя традиционный JavaScript
new function(){}
сопровождаемый путем создания псевдо конструктора.
Хорошо я просто думаю, что литерал объектов достаточно достаточно:
var singleton = {
dothis: function(){},
dothat: function(){}
}
право? Или кто-либо получил лучшее понимание?
[обновление]: Снова моя точка - то, почему люди только не используют более простой способ сделать одиночные элементы в JavaScript, когда я показал во втором отрывке, если существует абсолютная причина, скажите мне. Я обычно боюсь этого вида ситуации, что я упрощаю вещи до очень: D
Я согласен с вами, самый простой способ - использовать объект буквально, но если вы хотите 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
Одноэлементный шаблон реализуется путем создания класса с методом, который создает новый экземпляр класса, если он не существует. Если экземпляр уже существует, он просто возвращает ссылку на этот объект. 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);
Вы не просто объявляете синглтон как объект, потому что он создает его экземпляр, он не объявляет его. Он также не предоставляет механизма для кода, который не знает о предыдущей ссылке на синглтон для его получения. Синглтон - это не объект / класс, возвращаемый синглтоном, это структура. Это похоже на то, как закрытые переменные не являются замыканиями, область действия функции, обеспечивающая замыкание, является замыканием.
Синглтон - это не объект / класс, возвращаемый синглтоном, это структура. Это похоже на то, как закрытые переменные не являются замыканиями, область действия функции, обеспечивающая замыкание, является замыканием. Синглтон - это не объект / класс, возвращаемый синглтоном, это структура. Это похоже на то, как закрытые переменные не являются замыканиями, область действия функции, обеспечивающая замыкание, является замыканием.Я тоже об этом думал, но мне кажется разумным просто определение объекта с функциями в нем. Нет смысла создавать конструктор, который никто никогда не должен вызывать, для создания объекта без прототипа, когда вы можете просто определить объект напрямую.
С другой стороны, если вы хотите, чтобы ваш синглтон был экземпляром некоторого существующего " class "- то есть вы хотите, чтобы у него был какой-то другой объект в качестве прототипа - тогда вам do нужно использовать функцию конструктора, чтобы вы могли установить его свойство prototype
прежде чем его вызвать.
Последнее окно кода показывает то, что разработчики JS называют своей версией объектно-ориентированного дизайна в Javascript.
Сингетоны должны быть единичными объектами, которые не могут быть построены (за исключением, я полагаю, исходного определения. У вас есть один глобальный экземпляр одиночного объекта.
Я использовал вторую версию ( var singleton = {};
) для всего, от расширений Firefox до веб-сайтов, и работает очень хорошо. Хорошая идея - определять элементы не внутри фигурных скобок, а за их пределами, используя имя объекта, например:
var singleton = {};
singleton.dothis = function(){
};
singleton.someVariable = 5;
Возможно, вы сможете использовать 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
Вы также можете передавать аргументы любой функции (вам потребуется добавьте круглые скобки к первому примеру).
Крокфорд (кажется) согласен с тем, что литерал объекта - это все, что вам нужно для синглтона в JavaScript: