2012-05-21 9 views

Respuesta

23

Sí, puede usar extends en su lugar.

¿En cuanto a las diferencias? Vamos a empezar con una mirada a CoffeeScript:

class B extends A 

Veamos the JavaScript the CoffeeScript compiler produces para esta 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); 

Así, __extends se utiliza para declarar la relación entre inheritence B y A.

Vamos reiteran __extends un poco más legible, en 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 

(se puede comprobar que esto es una reproducción fiel de compiling it back to JavaScript.)

Esto es lo que está sucediendo:

  1. Todas las claves encontradas directamente en parent se configuran en child.
  2. Se crea un nuevo prototipo de constructor ctor, con sus instancias 'constructor propiedades establecidas en el elemento secundario y su prototype establecido en el elemento primario.
  3. La clase secundaria prototype se establece en una instancia de ctor. ctorconstructor se establecerá en child, y el prototipo de ctor en sí es parent.
  4. La propiedad __super__ de la clase infantil está configurada en parent 's prototype, para uso con la palabra clave super CoffeeScript.

node's documentation describe util.inherits como sigue:

heredan los métodos de prototipo de un constructor en otra. El prototipo de constructor se establecerá en un nuevo objeto creado a partir de superConstructor.

Como conveniencia adicional, el superConstructor será accesible a través de la propiedad constructor.super_.

En conclusión, no necesita usar util.inherits si está utilizando las clases de CoffeeScript; solo use las herramientas que CS le brinda, y obtendrá bonificaciones como la palabra clave super.

Cuestiones relacionadas