Kaz*_*Koe 94 javascript singleton design-patterns
我将这种模式用于单身人士,在单例中,单身人士是PlanetEarth:
var NAMESPACE = function () {
var privateFunction1 = function () {
privateFunction2();
};
var privateFunction2 = function () {
alert('I\'m private!');
};
var Constructors = {};
Constructors.PlanetEarth = function () {
privateFunction1();
privateFunction2();
};
Constructors.PlanetEarth.prototype = {
someMethod: function () {
if (console && console.log) {
console.log('some method');
}
}
};
Constructors.Person = function (name, address) {
this.name = name;
this.address = address;
};
Constructors.Person.prototype = {
walk: function () {
alert('STOMP!');
}
};
return {
Person: Constructors.Person, // there can be many
PlanetEarth: new Constructors.PlanetEarth() // there can only be one!
};
}();
Run Code Online (Sandbox Code Playgroud)
由于PlanetEarth的构造函数仍然是私有的,因此只能有一个.
现在,有些东西告诉我,这种自煮熟的东西不是最好的东西,主要是因为我没有接受过学术教育,而且我倾向于以愚蠢的方式解决问题.你会建议什么作为一种更好的替代方法,哪种更好被定义为风格更好和/或更强大?
Tom*_*ero 159
(1)更新2019年:ES7版本
class Singleton {
static instance;
constructor() {
if (instance) {
return instance;
}
this.instance = this;
}
foo() {
// ...
}
}
console.log(new Singleton() === new Singleton());
Run Code Online (Sandbox Code Playgroud)
(2)ES6版本
class Singleton {
constructor() {
const instance = this.constructor.instance;
if (instance) {
return instance;
}
this.constructor.instance = this;
}
foo() {
// ...
}
}
console.log(new Singleton() === new Singleton());
Run Code Online (Sandbox Code Playgroud)
找到最佳解决方案:http: //code.google.com/p/jslibs/wiki/JavascriptTips#Singleton_pattern
function MySingletonClass () {
if (arguments.callee._singletonInstance) {
return arguments.callee._singletonInstance;
}
arguments.callee._singletonInstance = this;
this.Foo = function () {
// ...
};
}
var a = new MySingletonClass();
var b = MySingletonClass();
console.log( a === b ); // prints: true
Run Code Online (Sandbox Code Playgroud)
对于那些想要严格版本的人:
(function (global) {
"use strict";
var MySingletonClass = function () {
if (MySingletonClass.prototype._singletonInstance) {
return MySingletonClass.prototype._singletonInstance;
}
MySingletonClass.prototype._singletonInstance = this;
this.Foo = function() {
// ...
};
};
var a = new MySingletonClass();
var b = MySingletonClass();
global.result = a === b;
} (window));
console.log(result);
Run Code Online (Sandbox Code Playgroud)
bob*_*nce 24
为什么要为单个对象使用构造函数和原型?
以上相当于:
var earth= {
someMethod: function () {
if (console && console.log)
console.log('some method');
}
};
privateFunction1();
privateFunction2();
return {
Person: Constructors.Person,
PlanetEarth: earth
};
Run Code Online (Sandbox Code Playgroud)
小智 18
通过Tom 扩展上述帖子,如果您需要类类型声明并使用变量访问单例实例,下面的代码可能会有所帮助.我喜欢这种符号,因为代码很少自我引导.
function SingletonClass(){
if ( arguments.callee.instance )
return arguments.callee.instance;
arguments.callee.instance = this;
}
SingletonClass.getInstance = function() {
var singletonClass = new SingletonClass();
return singletonClass;
};
Run Code Online (Sandbox Code Playgroud)
要访问单身人士,你会的
var singleTon = SingletonClass.getInstance();
Run Code Online (Sandbox Code Playgroud)