(1)工厂模式 (2)构造函数模式 (3)原型模式 (4)组合模式 (5)动态原型模式 (6)寄生构造函数模式 (7)稳妥构造函数模式
//工厂模式创建对象
function createObject(name,job){ var obj=new Object(); obj.name=name; obj.job=job; obj.sayName=function(){ alert(this.name); } return o;//把对象传出去 }但是,对于构造函数模式创建对象的方法,存在一个问题就是每个方法都要在每个实例上创建一次,使得不同实例上的同名函数是不相等的。 //解决构造函数创建的不同的实例的同名函数不相等的问题
function Person(name,job){ this.name=name; this.job=job; this.sayName=sayName;//把一个全局函数的指针给sayName } function sayName(){ alert(this,name); }优点:利用构造函数模式可以创建自定义对象。
每个函数都有一个原型属性(prototype),是一个指向被实例共享的属性和方法的指针,也就是说,prototype就是通过调用构造函数创建的那个对象实例的原型对象,它可以让所有实例共享属性和方法
//利用原型模式创建对象 function Person(){ } Person.prototype.name="Li"; Person.prototype.job="student"; Person.prototype.sayName=function(){ alert(this.name) }; var person=new Person(); person.sayName(); alert(person.constructor==Person) 也可以将Person.prototype用对象字面量表示,但是这种做法也就是相当于重写了原型对象 function Person(){ } Person.prototype={ constructor:Person, name:"Li", job:"student", friends:["han","Lian"], sayName:function(){ alert(this.name); } } var person1=new Person(); var person2=new Person(); person1.friends.pop(); console.log(person2.friends)但是,利用原型模式时,每次修改原型的属性就会被所有实例共享,也就是说,如果只想修改其中一个原型中属性值(引用类型值),而不改变另一个实例原型中的属性值是原型属性需要解决的问题,就像上面的代码中一样,person1对friends属性的修改也会影响person2的friends属性。
组合方式创建对象(构造函数模式定义属性,在原型中定义方法和共享的属性)
function Person(name,job){ this.name=name; this.job=job; this.friends=["han","Lian"]; } Person.prototype={ constructor:Person, sayName:function(){ alert(this.name) } } var person1=new Person("Li","student"); var person2=new Person("Li","student"); person1.friends.pop(); console.log(person1.friends)这样,就算person1对friends属性的修改也不会影响person2的friends属性,因为只是通过原型共享了方法,属性是来自于构造函数的。
动态原型模式,把所有的信息都封装在构造函数中。 思路:在构造函数中,初始化原型(比如上述的对象中中,可以在构造函数中判断sayName()方法是否存在,如果不存在,则在原型中定义
function perSon(name,job){ this.name=name; this.job=job; if(typeof sayName !="function"){ Person.prototypeof.sayName=function(){ alert(this.name); } } } var person1=new Person("Li","student"); person1.sayName();//寄生模式创建对象
function CreatePerson(name,job){ var obj=new Object(); obj.name=name; obj.job=job; obj.sayName=function(){ alert(this.name); } return obj; } var person1=new CreatePerson("Li","student");稳妥模式与寄生模式的区别:创建对象的实例方法中不用this,不用new操作符调用构造函数
//稳妥模式创建对象 function CreatePerson1(name,job){ var obj=new Object(); obj.name=name; obj.job=job; obj.sayName=function(){ console.log(name); } return obj; } var person1=CreatePerson1("Li","student"); person1.sayName();