1.组合使用构造函数模式和原型模式。
这样每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度地节省了内存。
//构造函数模式用于定义实例属性
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friend=["xj","nn"];
}
//原型模式用于定义方法和共享属性
Person.protoype={
constructor:Person,
sayName:function(){
alert(this.name);
}
}
var person1=new Person("AA",22,"Engineer");
var person2=new Person("BB",33,"Software");
person1.friends.push("Van");
alert(person1.friends); //"xj,nn,Van"
alert(person1.friends);//"xj,nn"
实例属性都是在构造函数中定义的,而由所有实例共享的属性constructor和方法sayName()则是在原型中定义的。
2.动态原型模式
动态原型模式把所有的信息都封装在构造函数中,而通过在构造函数中初始化原型,又保持了同时使用构造函数和原型的优点。
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
//如果不是方法,则把它改为方法,并添加到原型中
if(typeof this.sayName!="function"){
Person.prototype.sayName=function(){
alert(this.name);
};
}
}
//使用
var person=new Person("alal",22,"Software Engineer");
person.sayName();
这里只在sayName()方法不存在的情况下,才会将它添加到原型中。这里对原型中所作的修改,能够立即在所有实例中得到反映。
注意:使用动态原型模式时,不能使用对象字面量重写原型,因为如果在已经创建了实例的情况下重写原型,那么就会切断现有实例与新原型之间的联系。