對JS繼承的一點思考

在Javascript語言中,new命令後面跟的不是類,而是構造函數。javascript

舉個例子,如今有一個叫作CAT的構造函數,表示貓對象的原型。java

function CAT(name){
    this.name = name;
    this.age = 3;
}

當咱們new這個構造函數的時候,就會生成一個貓對象的實例。函數

var Tom = new CAT('Tom');
var Jack = new CAT('Jack');
Tom.age = 5;
alert(Tom.name+','+Tom.age);  //Tom,5
alert(Jack.name+','+Jack.age);  //Jack,3  不受Tom的影響

可是經過上面的例子你會發現:用構造函數生成實例對象,它有一個缺點,那就是沒法共享屬性和方法。this

由於這兩個對象的age屬性是獨立的,修改其中一個,不會影響到另外一個。prototype

這樣作的壞處就是會形成資源浪費,那麼咱們要如何來解決這件事呢,那就須要prototype出場了。code

這個屬性包含一個對象(如下簡稱"prototype對象"),全部實例對象須要共享的屬性和方法,都放在這個對象裏面;那些不須要共享的屬性和方法,就放在構造函數裏面。對象

CAT的代碼利用prototype就能夠改寫成這樣子了:
function CAT(name){
    this.name = name;
}
CAT.prototype.age = 3;
var Tom = new CAT('Tom');
var Jack = new CAT('Jack');
CAT.prototype.age = 5;
alert(Tom.name+','+Tom.age);   //Tom,5
alert(Jack.name+','+Jack.age);  //Jack,5

age屬性放在prototype對象裏,是兩個實例對象共享的。只要修改了prototype對象,就會同時影響到兩個實例對象。ip

相關文章
相關標籤/搜索