原理:
1.申明一个作用域里的具名函数,来模拟一个基类。函数的参数作为基类的参数传递。
2.具体而言:是在函数(模拟的基类)中声明局部的Object实例(通过构造函数声明的引用类型的值,只在本作用域有效),为这个实例添加属性和方法,这些属性和方法的值和该函数(模拟的基类)的参数挂钩;最后通过一个返回值返回出来。
3.返回之后:(调用)函数赋值给需要的子类,这就完成了一个声明子类的动作,于是这个子类就具有了这个函数(模拟的基类)预先定义的属性和方法。并可以通过传参来灵活的复用。
<span style="font-size:14px;"> <script type="text/javascript">
function Person(name){
var o = new Object();
o.name = name;
return o;
}
var yy = Person("yy");
</script></span>
优势和劣势:
优势:
这个是一个基本的模拟基类的方法,优势不多赘述。
劣势:
a.通过工厂模式创建的对象,由于都是基于返回值(Object)的,这样他的对象类型全都是Object,而不是它的基类。这样对于整个控制和拓展就不是很好。
<span style="font-size:14px;"> <script type="text/javascript">
function Person(name){
var o = new Object();
o.name = name;
return o;
}
var yy = Person("yy");
alert(yy instanceof Object); //true
alert(yy instanceof Person); //false
alert(yy.constructor == Object); //true
</script></span>
yy instanceof Object 返回是 ture;(yy是Object的实例);
同理:yy constructor == Object 返回是 ture(yy这个实例是通过构造函数Object构建的);
但是:yy instanceof Person 返回是 false,这样就很不好,是工厂模式一个非常大的缺点;
b.在工厂模式中定义的方法(function)实际上都去声明了一个function实例。这样相同的方法都要去反复声明,是不合理的。这个问题在构造函数模式中也存在,在构造函数里详述这个问题。