代码改变世界

利用函数的属性实现javascript的单例模式

2009-04-07 19:58  wlstyle  阅读(613)  评论(2)    收藏  举报

former:

 1             function Person(name){
 2                 if(Person.singlton){
 3                     return Person.singlton;
 4                 }
 5                 this.name=name;
 6                 Person.singlton=this;
 7             }
 8             Person.prototype={
 9                 getName:function(){
10                     return this.name;
11                 },
12                 setName:function(name){
13                     this.name=name;
14                 }
15             }
16             var tony=new Person('tony');
17             var jack=new Person('jack');
18             console.log(tony ===jack);

now:

 1 function Person(name){
 2     if(Person.caller !==Person.getInstance){
 3         alert('请通过公共入口Person.getInstance访问该单例');
 4         return {};
 5     }
 6     if (Person.singlton) {
 7         return Person.singlton;
 8     }
 9     this.name = name || "";
10     Person.singlton = this;
11     
12 }
13 Person.getInstance = function(){
14     return new Person();
15 }
16 Person.prototype = {
17     getName: function(){
18         return this.name;
19     },
20     setName: function(name){
21         this.name = name;
22     }
23 }

 

当实例化一个对象的时候,当第一次实例化的时候将当前对象的指针赋值给构造函数的属性。当第二次实例化的时候。检查这个函数的属性。如果这个属性不为undefined.那么将这个指向第一个创建对象的指针赋值给这个对象。这样就实现了单例。

小haha网友提出这不是单例模式,以前的模式虽然实际作用的实例是同一个但是没有提供统一的访问入口,现在提供统一的访问入口getInstance.