JS中创建对象的几种方式
每一个对象都是引用类型创建的。
一、工厂模式
1 function createPerson(){ 2 var o=new Object(); 3 o.name=name; 4 o.sex=sex; 5 o.sayName=function(){ 6 alert(this.name); 7 } 8 return o; 9 } 10 11 var person1=new createPerson('zhangsan','男'); 12 var person2=new createPerson('wangwu','女');
特点:1、用函数来封装,并以特定接口创建对象;2、有返回值
缺点:虽然解决了创建多个对象的问题,但没有解决对象识别的问题(怎样知道一个对象的类型)
二、构造函数模式(通过this实现)
用构造函数可以创建特定类型的对象,同时也可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法。
1 function Person(name,age){ 2 this.name=name; 3 this.age=age; 4 this.sayName=function(){ 5 alert(this.name); 6 } 7 }; 8 9 var person1=new Person('zhangsan',20); 10 var person2=new Person('wangwu',15);
与工厂模式的区别在于:
1、没有显式地创建对象;
2、直接将属性和方法赋给了this对象
3、没有return语句
三、原型模式(通过原型对象实现)
创建的每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,而这个对象包含了所有实例共享的属性和方法。
因此可以将属性和方法放在原型对象里面,让所有实例都可以共享。
1 function Person(){}; 2 3 Person.prototype.name='zhangsan'; 4 Person.prototype.age=20; 5 Person.prototype.sayName=function(){ 6 alert(this.name); 7 } 8 9 var person1=new Person(); 10 person1.sayName(); //zhangsan 11 12 var person2=new Person(); 13 person2.sayName(); //zhangsan
先新建一个空的构造函数,然后将属性和方法添加到原型对象里面,再创建实例对象,实例对象就拥有了原型对象里的属性和方法。不管创建多少个实例对象,原型对象里的属性和方法都是共享的。
四、组合构造函数模式和原型模式
构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性
1 function Person(name,age){ //构造函数模式 2 this.name=name; 3 this.age=age; 4 this.friends=['shelly','lucy']; 5 }; 6 7 Person.prototype.sayName=function(){ //原型模式 8 alert(this.name); 9 } 10 11 var person1=new Person('zhangsan',20); //构造函数模式 12 var person2=new Person('wangwu',15); 13 14 person1.friends.push('van'); 15 alert(person1.friends); //shelly,lucy,van 16 alert(person2.friends); //shelly,lucy
五、动态原型模式
就是将所有代码装在一起
六、寄生构造函数模式
1 function Person(){ 2 var o=new Object(); 3 o.name=name; 4 o.sex=sex; 5 o.sayName=function(){ 6 alert(this.name); 7 } 8 return o; 9 } 10 11 var person1=new Person('zhangsan','男'); 12 var person2=new Person('wangwu','女');
跟工厂模式很像,但是是构造函数创建得
七、稳妥构造函数模式