起初接觸到這個prototype我是拒絕的,我還是花了一部分時間來理解這個東西,算不上精通,有什么問題回復在下面
畢竟我是板磚挨慣了(滑稽);
在我理解看來,prototype不外乎就兩個基礎的作用:
1.動態的添加類的屬性和方法
2.復制原類的內容
我們先來看第一個:
首先來定義一個簡單的Person類;
var Person = function(name,age){
//指定該類的屬性為參數值
this.name = name;
this.age = age;
//為該類指定一個talk方法
this.talk = function(){
alert("talk");
};
};
下面我們來生成Person 的實例
var zhangsan = new Person("zhangsan",19);
var lisi = new Person("lisi",19);
1
2
這樣我們產生了兩個Person 的實例,zhangsan 和lisi ,原先Person里有個方法talk,而我們生成實例的時候,該talk會被再次生成一遍,因此這是極其不好的,因為假如我們要產生100個Person 的實例,該talk()就會被創建100次,而這很有可能導致內存溢出。那有沒有辦法只創建一次talk()呢,答案是有的!就是用prototype!
先來看一段代碼:
//照樣是定義一個Person的類
var Person = function(name,age){
//指定該類的屬性為參數值
this.name = name;
this.age = age;
//我們這里不再為Person設定talk方法
};
};
再次來生成Person 的實例
var zhangsan = new Person("zhangsan",19);
var lisi = new Person("lisi",19);
這里創建完畢后,我們得知,zhangsan和lisi都沒有talk的方法,我們現在用prototype給他們加上
Person.prototype.talk = function(){
alert("talk");
};
此時,Person所有的實例都擁有了這個方法
zhangsan.talk();//"talk"
lisi,talk();//"talk"
既然第一種用處搞清楚了,現在來看第二種用處。
所謂第二種用處就是復制原類的內容。
//新建一個類Person2
var Person2 = function(name,age){};
Person2.prototype = new Person();
此時的Person里的內容已經全部拷貝到Person2里面了