2012-11-27 160 views
1

我已經做了很多的閱讀。我寫了很多虛擬代碼。當我一勞永逸地征服JavaScript繼承時,我仍然和我一樣困惑。也許更是如此。Javascript原型類繼承

我非常欽佩Backbone.js,我喜歡它的使用集合。所以我閱讀了源代碼並感受到了啓發。但是我繼續跳過繼承與擴展對象的關係。

這裏,作爲最好的,我可以推斷出一個Javascript類繼承,用於該用途的目的,我看不出在使用擴展benfit:

function Collection(){ 
     this._models = []; 
    } 

    Collection.prototype = { 

     models: function() { 
      return this._models; 
     }, 

     fetch: function() { 
      console.log("TODO Override fetch method"); 
     }, 

     add: function(model){ 
      this._models.push(model); 
      $(this).triggerHandler("add", model); 
     }, 
    } 

    function Employees(){} 

    Employees.prototype = new Collection(); 

    Employees.prototype.fetch = function(){ 
     this._models = [new Person("Ron", "male"), new Person("Stevie", "female"), new Person("David Blunkett", "female")]; 
    } 

感覺有點怪訪問超類(Collection_models財產直接在Employees但它的工作原理。這種方法有什麼問題嗎?任何gottchas或警告?我不想建立一個應用程序,以找出它的一點點... ...。

編輯 它可能是值得注意的一個PersonModel太...

function Model(){} 

Model.prototype = { 
    get: function(attr){ 
     return this.attr; 
    }, 
    set: function(attr, value){ 
     return this[attr] = value; 
    } 
} 

function Person(name, gender){ 
    this.name = name; 
    this.gender = gender; 
} 

Person.prototype = new Model(); 

回答

1

你做父類的新實例和分配的辦法,作爲子類的原型是道格拉斯克羅克福德稱之爲「僞古典」的方法來繼承JavaScript。請參閱this in-depth video詳細介紹僞古典,原型和寄生繼承方法以及幾種變體。 (古典古董約12分鐘)。

您的方法可以正常工作,因爲您無法在此模式中共享構造函數代碼(至少不是沒有一些額外的幻想)。所以,如果你這樣做:

var e = new Employees(); 
console.log(e.constructor); 

您將看到Collection功能,而不是更直觀Employees功能。再一次看那個視頻,它非常清楚地涵蓋了整個話題。

+0

謝謝。我今天晚上試試看它。學習Javascript「課程」真的讓我失望 – JonWells

+0

真的很有幫助,謝謝 – JonWells