刚刚看了关于工厂模式的一部分。
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’)