1、使用Object构造函数创建
1 var person = new Object();2 person.name = "Lea";3 person.age = 26;4 alert(person.name)5 alert(person["name"])
2、对象字面量创建
1 var person = {2 name:"Lea",3 "my age":"26"4 }5 alert(person["my age"])
一般来说对象访问属性时使用点表示法,若属性名包含会导致语法错误的字符或属性名使用的是关键字或保留字,可以使用方括号表示法
以上两种方法有明显的缺点,就是使用同一个接口创建多个对象,会产生大量的重复代码
3、工厂模式
用函数封装以特定接口创建对象的细节,抽象了具体函数创建的过程,返回带有属性和方法的对象
1 function createPerson(name,age){ 2 var o = Object(); 3 o.name = this.name; 4 o.age = this.age; 5 o.syName = function(){ 6 alert(this.name); 7 } 8 return o; 9 }10 var person1 = createPerson("Lea","26");
该方法虽然解决了代码重复的问题,但却没有解决对象识别的问题,即知道该对象的类型
4、构造函数模式
创建自定义的构造函数,从而定义自定义对象类型的属性和方法,作为构造器函数首字母要大写,通过构造函数创建的对象可以标识为一种特定的类型,这是构造函数模式胜过工厂模式的地方,缺点是每个方法都要在每个实例上重新创建一遍,即不同实例上的同名函数是不相等的,构造函数与其它函数的区别在于调用方式不同,任何函数只要通过new操作符来调用,就可以作为构造函数
1 function Person(name,age){2 this.name = name;3 this.age = age;4 this.sayName = function(){5 alert(this.name);6 }7 }8 var person1 = Person("Lea","26");//不使用new来调用时,就是普通函数,返回undefined9 var person2 = new Person("Lea","26");//使用new调用,返回一个对象
其中person定义是没有使用new,即将构造函数当成普通函数,person1就是Person函数执行的返回值,这里没有返回值结果为undefined,Person中的this指的就是window,属性和方法都添加到window对象中,而person2是Person的实例
5、原型模式
每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,包含由特定类型的所有实例共享的属性和方法,使用原型模式可以让所有的对象实例都共享它所包含的属性和方法,即不在构造函数中定义对象实例的属性和方法,而是将这些信息直接添加到原型对象中,但是这会导致实例共享引用类型时(Person中的friends),所有实例的值是一样的,person1的friends添加字符串以后,person2.friends中也相应添加,这并非我们所期望的
1 function Person(){ 2 3 } 4 Person.prototype.name = "Lea"; 5 Person.prototype.age = "26"; 6 Person.prototype.friends = ["Lucy","Lili"]; 7 Person.prototype.sayName = function(){ 8 alert(this.name); 9 }10 var person1 = new Person();11 person1.friends.push("Jacy");12 alert(person1.friends)13 var person2 = new Person();14 alert(person2.friends)
6、组合使用构造函数模式和原型模式
组合使用构造函数模式和原型模式,构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性,这样每个实例都有自己的实例属性副本,同时又共享着方法的引用,最大的节省了内存
1 function Person(name,age){ 2 this.name = name; 3 this.age = age; 4 this.friends = ["Lucy","Lili"]; 5 } 6 Person.prototype = { 7 constructor:Person, 8 sayName:function(){ 9 alert(this.name);10 }11 }12 var person1 = Person("Lea","26")13 var person2 = Person("Jackson","26")14 person1.friends.push("Jack");15 alert(person1.friends)16 alert(person2.friends)
向person1.friends中添加的一个新的字符串,并不影响person1.friends
7、动态原型模式
动态原型模式将所有的信息都封装在构造函数中,而通过在构造函数中初始化原型,又保持了同时使用构造函数和原型的优点
1 function Person(name,age){2 this.name = name;3 this.age = age;4 if(typeof this.sayName !="function") {5 Person.prototype.sayName = function () {6 alert(this.name);7 };8 }9 }
8、寄生构造函数模式
寄生够高函数模式的基本思想就是创建一个函数,用来封装创建对象的代码,然后再返回新创建的对象
1 function Person(name,age){ 2 var o = new Object(); 3 o.name = name; 4 o.age = age; 5 o.syName = function(){ 6 alert(this.name); 7 } 8 return o; 9 }10 var person = new Person("Lea","26");11 person.sayName();
实例中通过person创建了一个新对象,并以相应的属性和方法初始化该对象,然后又返回这个对象,除了使用new操作符并把使用的包装函数叫做构造函数之外,这个模式跟工厂模式其实是一样的
9、稳妥构造函数模式
所谓稳妥对象,指的是没有公共属性,而且其方法也不引用this对象,不使用new操作符调用构造函数,适合在一些安全的环境中或者在防止数据被其他应用程序改动时使用
1 function Person(name,age){ 2 var o = Object(); 3 o.name = name; 4 o.age = age; 5 o.syName = function(){ 6 alert(name); 7 } 8 return o; 9 }10 var person = Person("Lea","26");11 person.sayName();