1.工厂模式
function createPerson(age,name){
var ob=new Object();
ob.name=name;
ob.age=age;
return ob;
}
缺点:无法解决对象识别问题
2.构造函数模式
function Person(name,age){
this.name=name;
this.age=age;
}
与工厂模式的区别:
1)没有显式的创建对象
2)直接将属性和方法给了this
3)没有return
4)调用时需要使用new的方法
5)创建的实例有一个constructor属性等于Person
优点:可以用instanceof 来检测对象累心
说明:
任何函数,只要通过NEW来调用,都是构造函数,任何函数,不通过NEW来调用,都不是构造函数。
缺点:构造函数里创建的函数对于不同实例来说是不同的,这个问题可以通过把函数定义在构造函数之外,然后再让构造函数内部的函数指向它。但这样做会导致多出了很多全局函数,封装性差。
构造函数在不给返回值的时候默认返回一个新的实例对象,也可以自己重写返回值。
3.原型模式
我们创建的每一个函数都有prototype属性,是一个指针,指向一个对象,这个对象可以包含由特定实例共享的属性和方法。就是说,我们不需要在构造函数里定义对象实例的信息,可以直接把信息添加到原型对象里。
我们再来讲讲原型对象:只要创建了一个函数,就会为该函数创建一个prototype属性,指向函数的原型对象,原型对象有一个constructor函数,再指回这个函数,也就是SOMEFUNCTION.prototype.constructor=SOMEFUNCTION
创建了自定义构造函数后,构造函数的原型对象只有一个constructor属性,还有一些从Object继承而来的方法,当调用构造函数创建一个新的实例后,这个实例的内部包含 一个指针,指向构造函数的原型对象,注意 ,是实例指向原型对象,而不是实例指向构造函数。
4.组合使用原型模式和构造函数模式
5.寄生构造函数模式:组合使用工厂模式和构造函数模
funciton Person(){
var values=new Array();
values.push.apply(values,arguments);
return values;
}
这里的返回的values和在函数外创建的数组对象一样,和构造函数、构造函数的原型属性之间不存在联系。不推荐使用。
参考资料《JS高程》