原型是Js中很是重要的概念,每一個函數(在Js裏面函數也是對象)都有一個叫prototype即原型)的屬性,不過在通常狀況下它的值都是null,但它他有一項很是重要的功能就是因此實例都會共享它裏面的屬性和方法(這就是Js裏面實現繼承的基礎)!
仍是舉例吧:web
function auth(){
alert(this.name);
//此處必定要加this關鍵字
}
auth.prototype.name='shiran';//這句能夠放到對象定義以後,但必須在被調用以前
new auth();//這裏必定要用new函數
這裏須要注意三點:
第1、name前面必定要加關鍵字this,否則的話就會得不到任何,由於若是你不加this,他就不會到原型中查找(加上this是屬性它會在上下文查找,看看前面我講的變量的查找那一章)。
第2、若是實例對象在對象中找不到屬性或方法就會到對象的prototype中去查找,因此若是想在函數被調用的時候調用對象的屬性或方法,就必須把調用語句放在prototype定義以後(在這裏,就是new auth必須放到auth.prototype.name以後)!
第3、只有實例對象纔會到原型中查找,由於對於原對象來講prototype是他的屬性必需經過prototype才能訪問(在這裏,要用new auth()生成一個實例,而不能用auth)!this
原型對於對象的實例來講是共享的,這既給程序帶來方便,同時也會讓人感到迷惑,出現好多讓人意想不到的結果!
auth=function(){ };
auth.prototype={
name:[],
getNameLen:function(){
alert(this.name.length);
},
setName:function(n){
this.name.push(n);
}
}spa
var lwx=new auth();
lwx.setName('lwx');
lwx.getNameLen();
var shiran=new auth();
shiran.setName('shiran');
shiran.getNameLen();
第二次彈出的對話框顯示name的長度已是2,爲何呢?這就是原型的共享引發的,由於變量lwx和shiran都是auth對象,並且name屬性是在auth對象的原型中定義的,因此lwx和shiran實例之間共享name這個屬性!!但是這並非咱們想要看到的結果,由於咱們但願,每一個實例之間是相互隔離的。
這裏咱們能夠把name屬性從原型中去掉,放在auth對象的定義中即:prototype
auth=function(){
this.name=[];//切記,必定要在前面加上this關鍵詞
};
這樣一來,每一個auth的實例都會擁有本身的name屬性!因此推薦你們,之後在定義對象的時候:把屬性放到定義裏,而把對象的方法放到原型裏!orm