工厂模式的安全模式

刚刚看了关于工厂模式的一部分。

    function factor(type){    
    }     
        factor.prototype={     
           basketball:function(){
           },        
        tennis:function(){
          }   
        }     
   var a=factor() ;   
   console.log(a)//输出undefined

为什么会输出undefined呢?
因为函数执行了以后,它没有返回值。。没有返回值的时候,它返回undefined。

顺带在这里写一下,new一个实例。经历了什么过程?

1.var obj={};

//创建了一个空对象

2.obj.proto=test.prototype;

//实例对象的__proto__指向(引用地址)它的构造函数的原型

3.test.call(obj); //构造函数的this指向这个新的对象;
4把obj的引用地址赋值给等式左边的变量

那么:

    function factor(type){    
    }     
        factor.prototype={     
           basketball:function(){
           },        
        tennis:function(){
          }   
        }     
   var a=new factor() ;   
   console.log(a)//a就是一个对象,拥有basketball和tennis方法。如果有属性的话,也会拥有属性。

接下来说工厂模式的安全模式。

为了防止有人调用函数不加new 操作符。我们需要加入安全模式。。

首先我们来看一下加不加new操作符中的this指向

  function factor(type){        
    console.log(this)//this指向window            
    }     
    factor.prototype={        
    basketball:function(){
    },        
    tennis:function(){
    }    
  }      
   var a=factor();
        

加了new操作符之后:

  function factor(type){        
    console.log(this)
    //this指向a,他可以通过instanceof factor判断。           
    }     
    factor.prototype={        
    basketball:function(){
    },        
    tennis:function(){
    }    
  }      
   var a=new factor();
        

这样就很清晰了:

       var factor = function (type) {         
       //    if(typeof type!='string'){        
       //        throw new Error('参数不为一个字符串')       
        //    }
       if(this instanceof factor){
       //有new操作符,this指向实例对象, 防错处理        
       return new this[type]()        
       }else{    
       //没有new操作符,this指向window。                
        var s=new factor(type)                  
         return s               
          }                       
           }                
          factor.prototype = {                    
          basketball: function () {                   
          },                   
           tennis: function () {}                
            }                
            var a=new factor('basketball')        
            var b=factor('basketball')
            

上面俩货效果是一样的。。。
比如 var b=factor(‘basketball’),
经过判断,得到的是:var b=new factor(‘basketball’)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值