1、 工厂模式
function createPerson(name,age,job){
var o = new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayName=sayName;
return o;
}
function sayName(){
alert(this.name);
}
2 构造模式
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=sayName;
}
根据OO原则,函数首字母大写。
要创建Person必须使用new,该种方式能够将实例标识成一个特定的类型,例如
var person1 = new Person();
alert(person1 instranceof Person); true,
任何用new操作符来调用的函数,均可作为构造函数。
3 原型模式
我们创建的每个函数都有一个protptype属性,该属性是一个指针,指向一个对象
function Person(){} //构造函数什么都没,如果有为实例属性或者实例方法
Person.prototype.name='wang'; //原型属性
Person.prototype.age = 30;
Person.prototype.sayName = function(){ //原型方法
return this.name+' '+this.age;
};
var p1 = new Person();
var p2 = new Person();
alert(p1.sayName==p2.sayName);
原型模式执行流程:
1、先查找构造函数的实例属性或者方法,如果有立即返回
2、如果构造函数里面没有,在原型对象里面查找。
delete p1.name删除属性
hasOwnProperty()判断在实例中是否存在指定属性
‘name’ in p1 //不管实例或者原型中只要存在,返回true
原型模式,所有初始化值是一致的,这也是原型模式的最大优点,共享。
4、原型与共享模式
不共享的部分使用构造方式,共享部分使用原型模式
function Person(name,age){
this.name=name,
this.age=age;
} //构造函数什么都没,如果有为实例属性或者实例方法
Person.prototype = {
constructor: Person,
sayName:function(){
return this.name+this.age;
}
}
alert(new Person('wangg',29).sayName());
此种方式解决了传参和共享的问题
5、动态原型模式
function Person(name,age){
this.name=name,
this.age=age;
this.family=[‘秋鸣’,’旺琴’];
//原型的初始化只要第一次执行就ok,不需要每次
if (typeof this.sayName!='function') {
Person.prototype.sayName = function(){
alert(this.family);
return this.name+this.age;
}
}
} //构造函数什么都没,如果有为实例属性或者实例方法
alert(new Person('test1',29).sayName());
alert(new Person('test2',29).sayName());