2012-05-21 11 views

risposta

23

Sì, è possibile utilizzare extends al posto di esso.

Per quanto riguarda le differenze? Cominciamo con uno sguardo a CoffeeScript:

class B extends A 

Diamo un'occhiata a the JavaScript the CoffeeScript compiler produces per questo JavaScript:

var B, 
    __hasProp = {}.hasOwnProperty, 
    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; 

B = (function(_super) { 

    __extends(B, _super); 

    function B() { 
    return B.__super__.constructor.apply(this, arguments); 
    } 

    return B; 

})(A); 

Quindi, __extends consente di dichiarare il rapporto tra l'ereditarietà B e A.

Diamo ribadiscono __extends un po 'più essere letti, in CoffeeScript:

coffee__extends = (child, parent) -> 
    child[key] = val for own key, val of parent 

    ctor = -> 
    @constructor = child 
    return 
    ctor.prototype = parent.prototype 

    child.prototype = new ctor 
    child.__super__ = parent.prototype 

    return child 

(è possibile verificare che si tratta di una fedele riproduzione da compiling it back to JavaScript.)

Ecco cosa sta succedendo:

  1. Tutti i tasti trovati direttamente su parent sono impostati su child.
  2. Viene creato un nuovo costruttore prototipo ctor, con le relative proprietà 'constructor impostate sul figlio e il relativo prototype impostato su padre.
  3. La classe figlio prototype è impostata su un'istanza di ctor. sarà impostato su child e il prototipo dello stesso ctor è parent.
  4. La proprietà __super__ della classe figlio è impostata su parent's prototype, per l'utilizzo dalla parola chiave super di CoffeeScript.

node's documentation descrive util.inherits come segue:

ereditano i metodi prototipo da un costruttore in un altro. Il prototipo di costruttore verrà impostato su un nuovo oggetto creato dal superConstructor .

Come ulteriore comodità, il superConstructor sarà accessibile tramite la proprietà constructor.super_.

In conclusione, non è necessario utilizzare util.inherits se si utilizzano classi di CoffeeScript; usa solo gli strumenti che ti dà CS e ottieni dei bonus come la parola chiave super.