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 中,單例可以讓您保證命名空間對象和函數井井有理,防止它們與全局命名空間混淆,您可能明白,這是一種可怕的想法,特別是在使用第三方代碼的狀況下。 使用命名空間單例模式也被稱爲模塊設計模式。