1煮盼,js原型(prototype)繼承
首先了解下prototype
1短纵,在js一切皆對(duì)象中,了解到凡是通過new function()
創(chuàng)建的對(duì)象都是函數(shù)對(duì)象僵控,否則就是普通對(duì)象香到。
2,普通對(duì)象沒有prototype
屬性但有_proto_
屬性报破,函數(shù)對(duì)象都包含prototype
和_proto_
屬性
3养渴,原型對(duì)象的主要作用就是為了實(shí)現(xiàn)繼承。
4泛烙,使用原型繼承可以達(dá)到:1理卑,可以動(dòng)態(tài)的給所需對(duì)象設(shè)置屬性和方法 。 2蔽氨,子類繼承父類藐唠,可以使用和享有父親的所有屬性和方法。
<html>
<body>
<script type="text/javascript">
function Person(name,age){ // 父類
this.name=name; //父類的私有屬性
this.age=age;
}
Person.prototype.sayHello=function(){ //用處1鹉究,動(dòng)態(tài)的給父類Person增加sayHello方法
alert("使用原型得到Name:"+this.name);
}
var per=new Person("馬小倩",21);
per.sayHello(); //輸出:使用原型得到Name:馬小倩
---------------------------------------------
function Student(){} //當(dāng)做子類
Student.prototype=new Person("洪如彤",21); //用處2:子類Student繼承父類Person的所有方法和屬性
var stu=new Student(); //然后創(chuàng)建子烈的實(shí)例
Student.prototype.grade=5; //再給子類動(dòng)態(tài)添加grade屬性
Student.prototype.intr=function(){ //再給子類動(dòng)態(tài)添加intr方法
alert(this.grade);
}
stu.sayHello();//使用原型得到Name:洪如彤 宇立。使用從父類繼承的sayHello()方法
stu.intr();//5 。使用給子類動(dòng)態(tài)添加的intr方法
</script>
</body>
</html></SPAN></SPAN>
2自赔,call和apply
首先了解下call和apply
obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);
**
歸根揭底就是一句話:
把obj的this綁定到thisObj上妈嘹,這時(shí)候thisObj具備了(或者說繼承了)obj的屬性和方法,然后在thisObj的執(zhí)行環(huán)境里面執(zhí)行obj的屬性和方法绍妨,綁定后會(huì)立即執(zhí)行函數(shù)
**
1润脸,apply和call 本來就是為了擴(kuò)展函數(shù)的作用域而生的,換句話說就是為了改變this的指向存在的
2他去,當(dāng)一個(gè)object沒有某種方法毙驯,但是其他的有,我們可以借助call和apply來用其他對(duì)象的方法來做操作灾测,也可以傳參數(shù)
<body>
<script type="text/javascript">
function Person(name,age,love){ //原父類方法和私有屬性以及方法
this.name=name;
this.age=age;
this.love=love;
this.say=function say(){
alert("姓名:"+name);
}
}
//call方式
function student(name,age){ // 可以理解為在student的執(zhí)行環(huán)境里執(zhí)行person的屬性和方法
Person.call(this,name,age);
}
//apply方式
function teacher(name,love){ //可以理解為在student的執(zhí)行環(huán)境里執(zhí)行person的屬性和方法
Person.apply(this,[name,love]);
//Person.apply(this,arguments); //跟上句一樣的效果爆价,arguments
// Print.apply(this,arguments); //還可以實(shí)現(xiàn)繼承多個(gè)父類,但是原型 prototype只能繼承一個(gè)父類!C巍骤宣!切記
}
var per=new Person("武鳳樓",25,"魏熒屏"); //輸出:“武鳳樓”
per.say();
var stu=new student("曹玉",18);//輸出:“曹玉”
stu.say();
var tea=new teacher("秦杰",16);//輸出:“秦杰”
tea.say();
</script>
</body>
</html></SPAN>
** 總結(jié):
1,prototype可以動(dòng)態(tài)的給對(duì)象增加屬性和方法
2序愚,可以實(shí)現(xiàn)子類繼承父類涯雅,擁有父類的屬性和方法
3,call和apply的區(qū)別展运,在于參數(shù)活逆。
4,call和apply拗胜,可以膚淺理解為在子運(yùn)行環(huán)境中執(zhí)行父類的方法和屬性蔗候。
5,call和apply可以實(shí)現(xiàn)多繼承埂软,一個(gè)子類可以繼承多個(gè)父類锈遥,但是prototype只能有有一個(gè)父類**