我有一些关于在javascript中创建单例的方法的阅读 - 简单的对象文字方式和另一种使用闭包技术的方法,如果我们想要使用私有变量。
我希望创建一个实用程序功能,例如
Singleton(classname);
无论什么类 - “构造函数”我在这里作为参数传递,Singleton方法将此类转换为Singleton对象,在调用new Classname()
之后如果有人再次触发新的classname(),则他/她得到一些{ {1}}
用例如下 -
new Error ( "Already instantiated once, this is Singleton" );
我只是想在这里定义“Singleton”方法。
我见过类似的例子,其中getInstance方法用于获取实例,如 Singleton.getInstance(Circle)等,但我正在寻找上面的特定问题,其他程序员习惯于创建“新”方式的实例尝试在代码中的某个位置第二次触发function Circle() {this.name = "Circle";}
SingleTon(Circle);
var circle1 = new Circle(); // returns the circle instance
var circle2 = new Circle(); // throws Error "Already instantiated once, this is Singleton"
并收到错误。
以这种方式创建单例是一个问题,但主要问题是抛出“错误”,据我所知,Circle构造函数需要在Singleton函数中的某处修改,不知道如何实现这一点。
有没有解决方案?
提前致谢!!
答案 0 :(得分:4)
function Singleton(param){
var count = 0, old = window[param];
window[param] = function(){
if(++count <= 1) return old;
else alert('NO WAY!');
}
}
您可以将其称为:
Singleton('Circle');
演示:http://jsfiddle.net/maniator/7ZFmE/
请记住,仅当Circle
或任何其他函数类位于全局window
命名空间中时,此方法才有效。任何其他命名空间中的任何内容都需要更多操作才能使其完全正常工作。
答案 1 :(得分:0)
试试这个:
Circle = function () {
if (!(this instanceof Circle)) {
// called as function
return Circle.singleton || (Circle.singleton = new Circle());
}
// called as constructor
this.name = "the circle";
};
现在,如果没有新的运算符,您可以使用
获取单例或新单元var mycircle = Circle();
注意我正在使用示例的全局名称,您也可以使用
var Circle = window.Circle = function () { //...
答案 2 :(得分:0)
你当然也可以创建一个单独的实例Object,可以使用类似的闭包:
var singlecircle = (new function(name) {
this.name = name || "Default circle";}('squared')
);
singlecircle.name; //=> 'squared'