将类 "constructor function"转换为单例的 Javascript 实用函数

标签 javascript singleton utility-method

我阅读了一些关于在 javascript 中创建单例的两种方法 - 简单的对象文字方法和另一种使用闭包技术的方法,如果我们想使用私有(private)变量的话。

例如,我希望创建一个效用函数

Singleton(classname);

无论我在此处作为参数传递的类 - “构造函数”,Singleton 方法都会将此类转换为 Singleton 对象,如果有人再次触发 new classname(),则在调用 new Classname() 后加上他/她收到一些 new Error ( "Already instantiated once, this is Singleton");

用例如下-

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"

我只是想在这里定义“Singleton”方法。

我见过类似的例子,其中 getInstance 方法用于获取实例,例如 - Singleton.getInstance(Circle) 等,但我正在寻找上面的特定问题,另一个程序员习惯于创建"new"方式中的一个实例试图在他的代码中的某处第二次触发 new Circle(); 并收到错误。

以这种方式创建单例是一个问题,但主要问题是抛出“错误”,据我所知,需要在 Singleton 函数的某处修改 Circle 构造函数,但不确定如何完成此操作。

有什么解决办法吗?

提前致谢!!

最佳答案

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 命名空间中时才有效。任何其他命名空间中的任何内容都需要更多操作才能使其完全工作。

关于将类 "constructor function"转换为单例的 Javascript 实用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13239272/

相关文章:

javascript - react 导航5错误绑定(bind)元素 'navigation'隐式具有 'any' type.ts

javascript - React Router 不改变显示的组件

iphone - 如何使用 Apple 单例模式访问 SQLite 数据库?

c++ - 可移植线程安全的懒惰单例

jquery - JQuery 命名空间 + 通用实用函数的最佳实践

java - 您更喜欢重复代码而不是实用程序类吗?

javascript - Backbone : Use Model's Data and Functions in View

javascript - ajax 调用阻止 anchor 标记的 HREF 值后返回 false 不起作用

java - 如何停止创建单例实例

java - 在最终(实用程序)类中模拟私有(private)静态方法