2012-11-27 165 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