组合使用构造函数模式和原型模式
构造函数模式
自定义类型并且定义类型的属性和方法,就是创建对象。
function Person(name,age){
this.name = name;
this.age = age;
this.sayName = function(){
alert(this.name);
}
}
var person1 = new Person("Tony", 19);
var person2 = new Person("Bob",22);
alert(person1.sayName === person2.sayName)//false。即两个实例的该方法是两个不同的对象,重复定义了一个sayName
定义了一个Person对象,具有两个属性和sayName方法。
但是有一个问题,sayName方法位于构造函数中,每个实例在创建时都会创建一个sayName方法,在JavaScript中,函数就是对象,那么每次就会创建一个对象但是用处是重复的。当一个对象中有多个方法时就会创建很多个重复的实例方法。
原型模式
利用原型模式创建对象,使用原型对象可以让所有对象实例共享它所包含的属性和方法。
function Person(){
}
Person.prototype = {
name : "Tony",
age : 19,
sayName : function(){
alert(this.nama);
}
};
在博文《原型对象的特殊点》提到过,原型对象中不能设置属性为引用类型,否则一个实例的该属性改变,所有实例的该属性都会跟着改变。虽然解决了方法重复定义的问题但是每个实例想要拥有特殊单独的属性就变得麻烦。
组合使用
用原型模式定义共同的方法,用构造函数定义每个实例独有的属性就完美解决了问题。
function Person(name, age){
this.name = name;
this.age = age;
}
Person.prototype = {
constructor : Person,
sayName : function(){
alert(this.name);
}
}
var person1 = new Person("Bob",22);
var person2 = new Person("Aishi",18);
alert(person1.sayName === person2.sayName);//true。即该方法在两个实例中完全相同