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','女');

跟工厂模式很像,但是是构造函数创建得

七、稳妥构造函数模式

 

posted @ 2018-03-18 19:58  endlessmy  阅读(6144)  评论(0编辑  收藏  举报