1. javascript的方法可以分為三類:
a 類方法;b 對(duì)象方法;c 原型方法
例子:
//對(duì)象方法
function People(name){?
this.name=name;
this.Introduce=function(){
alert("My?name?is"+this.name);
} }
//類方法
People.Run=function(){
alert("I?can?run");
}
//原型方法
People.prototype.IntroduceChinese=function(){
alert("我的名字是"+this.name);
}
//測(cè)試
var p1=newPeople("Windking");
p1.Introduce();
People.Run();
p1.IntroduceChinese();
prototype是什么含義?
javascript中的每個(gè)對(duì)象都有prototype屬性,Javascript中對(duì)象的prototype屬性的解釋是:返回對(duì)象類型原型的引用。
A.prototype = new B();
理解prototype不應(yīng)把它和繼承混淆。A的prototype為B的一個(gè)實(shí)例,可以理解A將B中的方法和屬性全部克隆了一遍。A能使用B的方法和屬性。這里強(qiáng)調(diào)的是克隆而不是繼承。可以出現(xiàn)這種情況:A的prototype是B的實(shí)例,同時(shí)B的prototype也是A的實(shí)例。
先看一個(gè)實(shí)驗(yàn)的例子:
function baseClass(){
this.showMsg=function() { alert("baseClass::showMsg"); }
}
function extendClass(){}
extendClass.prototype=newbaseClass();
var instance=newextendClass();
instance.showMsg();//顯示baseClass::showMsg
我們首先定義了baseClass類,然后我們要定義extentClass,但是我們打算以baseClass的一個(gè)實(shí)例為原型,來(lái)克隆的extendClass也同時(shí)包含showMsg這個(gè)對(duì)象方法。
extendClass.prototype = new baseClass()就可以閱讀為:extendClass是以baseClass的一個(gè)實(shí)例為原型克隆創(chuàng)建的。
測(cè)試1:
function baseClass(){
this.showMsg=function(){alert("baseClass::showMsg");}
}
function extendClass(){
this.showMsg=function()
{ alert("extendClass::showMsg"); } }
extendClass.prototype=newbaseClass();
var instance=newextendClass();
instance.showMsg();//顯示extendClass::showMsg
如果extendClass中本身包含有一個(gè)與baseClass的方法同名的方法,函數(shù)運(yùn)行時(shí)會(huì)先去本體的函數(shù)中去找,如果找到則運(yùn)行,找不到則去prototype中尋找函數(shù)。或者可以理解為prototype不會(huì)克隆同名函數(shù)。
測(cè)試2:
extendClass.prototype=newbaseClass();
var instance=newextendClass();
varbaseinstance=newbaseClass();
baseinstance.showMsg.call(instance);//顯示baseClass::showMsg
這里的baseinstance.showMsg.call(instance);閱讀為“將instance當(dāng)做baseinstance來(lái)調(diào)用,調(diào)用它的對(duì)象方法showMsg”
好了,這里可能有人會(huì)問,為什么不用baseClass.showMsg.call(instance);
這就是對(duì)象方法和類方法的區(qū)別,我們想調(diào)用的是baseClass的對(duì)象方法
測(cè)試總結(jié):
function baseClass(){
this.showMsg=function(){ alert("baseClass::showMsg");}
this.baseShowMsg=function(){
alert("baseClass::baseShowMsg");
}
}
baseClass.showMsg=function(){
alert("baseClass::showMsg?static");
}
function extendClass(){
this.showMsg=function(){alert("extendClass::showMsg");}
}
extendClass.showMsg=function(){
alert("extendClass::showMsg?static")
}
extendClass.prototype=newbaseClass();
var instance=newextendClass();
instance.showMsg();//顯示extendClass::showMsg
instance.baseShowMsg();//顯示baseClass::baseShowMsg
instance.showMsg();//顯示extendClass::showMsg
baseClass.showMsg.call(instance);//顯示baseClass::showMsg?static
varbaseinstance=newbaseClass();
baseinstance.showMsg.call(instance);//顯示baseClass::showMsg