归纳综合:建立自定义范例的最常见体式格局,就是组合运用组织函数情势与原型情势。
优点:经由过程这类体式格局,不仅每一个实例都有本身的一份实例属性的副本,而且同时又同享着对要领的援用,最大限制的节省了内存。而且这类夹杂情势还支撑向组织函数通报参数,可谓是集两种情势之长。
定义情势:有两种定义体式格局,体式格局-:离开定义(如许更好明白组织函数和原型),体式格局二:动态定义(把一切信息都封装在了组织函数中,经由过程在组织函数中初始化原型,又坚持了同时运用组织函数和原型的有点,换句话说,能够经由过程搜检某个应当存在的要领是不是有用,来决议是不是须要初始化原型)。
运用:
体式格局一:离开定义,用来明白组织函数与原型
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friends=["Sandy","Court"];
}
Person.prototype={
constructor:Person,
sayName:function(){
alert(this.name);
}
}
体式格局二:动态原型情势定义,防止自力的组织函数和原型,更圆满的定义情势。
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friends=["xiaohonghua","xiaohuanghua"];
if(typeof this.sayName!="function"){
Person.prototype.sayName=function(){
alert(this.name);
};
}
}
- 这里的sayName()要领不存在的情况下,才会将它添加到原型中。这段代码只会在首次挪用组织函数时才会实行,今后,原型已完成初始化,不须要在做什么修正了。不过假如修正,会马上在一切实例中获得反应。
挪用:
由于sayName()要领是原型要领,所以是Person实例的一切同享要领,而组织函数中定义的种种属性是各个实例的属性,随便变动,不影响其他实例。
function test(){
var person1=new Person1("xiaohong",26,"Teacher");
var person2=new Person1("xiaoming",27,"Soft Engineer");
person1.friends.push("Van");
alert(person1.friends); //xiaohonghua,xiaohuanghua,Van
alert(person2.friends); //xiaohonghua,xiaohuanghua
alert(person1.friends == person2.friends); //false
alert(person2.sayName == person2.sayName); //true
person1.sayName(); //xiaohong
}