var instantiated; var Singleton = function () { var name = "fengshu"; function init() { return { publicMethod: function () { console.log('hello world'); }, test: 1 }; } if (!instantiated) { instantiated = init(); } return instantiated; }; //undefined 方法里面的变量为局部变量,只能在方法内部使用 console.log(Singleton.name); var single = new Singleton(); console.log(single.test) var single2 = new Singleton(); //true 单例 console.log(single === single2);
var Person=function () { //公有属性 this.name="fengshu"; //私有属性 var age = 23; //私有方法 var calAge=function(){ return this.age; } //公有方法 this.getAge=function(){ return calAge(); } } var person=new Person(); console.log(person)
在以上两个例子中方法内部的方法其实就是闭包,由于他们劫持了函数的内部变量,达到了访问函数内部变量的效果 javascript
一、咱们能够很容易理解单例在Java、c++等语言中的做用,由于他们处理的是后台逻辑,但不要忘了javascript也是能够处理后台逻辑的,好比nodejs,在处理数据库链接等问题的时候咱们须要用到单例 java
二、哪怕是在前台也是很须要用到单例模式的,好比处理ajax清楚的xmlhttp request对象 node
三、 c++
在 JavaScript 中,单例可以让您保证命名空间对象和函数井井有理,防止它们与全局命名空间混淆,您可能明白,这是一种可怕的想法,特别是在使用第三方代码的状况下。 使用命名空间单例模式也被称为模块设计模式。