CoffeeScript - Clases y herencia

JavaScript no proporciona la classpalabra clave. Podemos lograr la herencia en JavaScript usando objetos y sus prototipos. Cada objeto tiene su propio prototipo y hereda funciones y propiedades de sus prototipos. Dado que el prototipo también es un objeto, también tiene su propio prototipo.

Aunque la herencia prototípica es mucho más poderosa que la herencia clásica, es difícil y confusa para los usuarios novatos.

Clases en CoffeeScript

Al abordar este problema, CoffeeScript proporciona una estructura básica conocida como classque se construye utilizando los prototipos de JavaScript. Puede definir una clase en CoffeeScript usando la palabra clave class como se muestra a continuación.

class Class_Name

Ejemplo

Considere el siguiente ejemplo, aquí hemos creado una clase llamada Student usando la palabra clave class.

class Student

Si compila el código anterior, generará el siguiente JavaScript.

var Student;

Student = (function() {
  function Student() {}

  return Student;

})();

Instanciar una clase

Podemos crear una instancia de una clase usando el operador new al igual que otros lenguajes de programación orientados a objetos como se muestra a continuación.

new Class_Name

Puede crear una instancia de la clase (Estudiante) creada anteriormente utilizando el new operador como se muestra a continuación.

class Student
new  Student

Si compila el código anterior, generará el siguiente JavaScript.

var Student;

Student = (function() {
  function Student() {}

  return Student;

})();

new Student;

Definición de un constructor

Un constructor es una función que se invoca cuando instanciamos una clase, su propósito principal es inicializar las variables de instancia. En CoffeeScript, puede definir un constructor simplemente creando una función con nombreconstructor Como se muestra abajo.

class Student
  constructor: (name)->
  @name = name

Aquí, hemos definido un constructor y asignado el nombre de la variable local a la variable de instancia.

los @ operador es un alias para el this palabra clave, se utiliza para señalar las variables de instancia de una clase.

Si colocamos @antes de un argumento del constructor, se establecerá automáticamente como una variable de instancia. Por lo tanto, el código anterior se puede escribir simplemente como se muestra a continuación:

class Student
  constructor: (@name)->

Ejemplo

Aquí hay un ejemplo de un constructor en CoffeeScript. Guárdalo en un archivo con el nombreconstructor_example.coffee

#Defining a class
class Student
  constructor: (@name)->

#instantiating a class by passing a string to constructor
student = new Student("Mohammed");
console.log "the name of the student is :"+student.name

Compiling the code

Abra el símbolo del sistema y compile el ejemplo anterior como se muestra a continuación.

c:\>coffee -c constructor_example.coffee

Al ejecutar el comando anterior, producirá el siguiente JavaScript.

// Generated by CoffeeScript 1.10.0
(function() {
  var Student, student;

  Student = (function() {
    function Student(name) {
      this.name = name;
    }

    return Student;

  })();

  student = new Student("Mohammed");

  console.log("The name of the student is :"+student.name);

}).call(this);

Executing the Code

Ejecute el ejemplo anterior ejecutando el siguiente comando en el símbolo del sistema.

coffee constructor_example.coffee

Al ejecutar, el ejemplo anterior le da el siguiente resultado.

The name of the student is :Mohammed

Propiedades de la instancia

Al igual que en los objetos, también podemos tener propiedades dentro de una clase. Y estos se conocen comoinstance properties.

Ejemplo

Considere el siguiente ejemplo. Aquí, hemos creado variables (nombre, edad) y una función (mensaje ()) dentro de la clase y accedimos a ellas usando su objeto. Guarde este ejemplo en un archivo llamadoinstance_properties_example.coffee

#Defining a class
class Student
  name="Ravi"
  age=24
  message: ->
    "Hello "+name+" how are you" 

#instantiating a class by passing a string to constructor
student = new Student();
console.log student.message()

Al compilar, el código anterior genera la siguiente salida.

// Generated by CoffeeScript 1.10.0
(function() {
  var Student, student;

  Student = (function() {
    var age, name;

    function Student() {}

    name = "Ravi";

    age = 24;

    Student.prototype.message = function() {
      return "Hello " + name + " how are you";
    };

    return Student;

  })();

  student = new Student();

  console.log(student.message());

}).call(this);

Propiedades estáticas

Podemos definir propiedades estáticas en la clase. El alcance de las propiedades estáticas está restringido dentro de la clase y creamos funciones estáticas usando elthis keyword o su alias @símbolo y tenemos que acceder a estas propiedades usando el nombre de clase como Class_Name.property .

Ejemplo

En el siguiente ejemplo, hemos creado una función estática llamada mensaje. y accedí a él. Guárdalo en un archivo con el nombrestatic_properties_example.coffee.

#Defining a class
class Student
  @message:(name) ->
    "Hello "+name+" how are you" 
console.log Student.message("Raju")

Abra el símbolo del sistema y compile el archivo CoffeeScript anterior con el siguiente comando.

c:\>coffee -c  static_properties_example.coffee

Al compilar, le da el siguiente JavaScript.

// Generated by CoffeeScript 1.10.0
(function() {
  var Student;

  Student = (function() {
    function Student() {}

    Student.message = function(name) {
      return "Hello " + name + " how are you";
    };

    return Student;

  })();

  console.log(Student.message("Raju"));

}).call(this);

Ejecute el coffeeScript anterior en el símbolo del sistema como se muestra a continuación.

c:\>coffee static_properties_example.coffee

Al ejecutar, el ejemplo anterior le da el siguiente resultado.

Hello Raju how are you

Herencia

En CoffeeScript, podemos heredar las propiedades de una clase en otra clase usando extends palabra clave.

Ejemplo

A continuación se muestra un ejemplo de herencia en CoffeeScript. Aquí, tenemos dos clases a saberAdd y My_class. Heredamos las propiedades de la clase llamada Add en la clase My_class y accedimos a ellas usando elextends palabra clave.

#Defining a class
class Add
   a=20;b=30
   
   addition:->
     console.log "Sum of the two numbers is :"+(a+b) 

class My_class extends Add

my_class = new My_class()
my_class.addition()

CoffeeScript utiliza la herencia de prototipos entre bastidores. En CoffeeScript, siempre que creamos instancias, se invoca el constructor de la clase padre hasta que lo anulamos.

Podemos invocar el constructor de la clase padre desde la subclase, usando el super() palabra clave como se muestra en el ejemplo que se muestra a continuación.

#Defining a class
class Add
   constructor:(@a,@b) ->
   
   addition:=>
     console.log "Sum of the two numbers is :"+(@[email protected]) 

class Mul extends Add
   constructor:(@a,@b) ->
     super(@a,@b)
   
   multiplication:->
     console.log "Product of the two numbers is :"+(@a*@b)

mul = new Mul(10,20)
mul.addition()
mul.multiplication()

Clases dinámicas

CoffeeScript usa la herencia de prototipos para heredar automáticamente todas las propiedades de instancia de una clase. Esto asegura que las clases sean dinámicas; incluso si agrega propiedades a una clase padre después de que se haya creado un hijo, la propiedad aún se propagará a todos sus hijos heredados.

class Animal
  constructor: (@name) ->

class Parrot extends Animal

Animal::rip = true

parrot = new Parrot("Macaw")
console.log "This parrot is no more" if parrot.rip

Al ejecutarse, el CoffeeScript anterior genera el siguiente código JavaScript.

// Generated by CoffeeScript 1.10.0
(function() {
  var Animal, Parrot, parrot,
    extend = 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; },
    hasProp = {}.hasOwnProperty;

  Animal = (function() {
    function Animal(name) {
      this.name = name;
    }

    return Animal;

  })();

  Parrot = (function(superClass) {
    extend(Parrot, superClass);

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

    return Parrot;

  })(Animal);

  Animal.prototype.rip = true;

  parrot = new Parrot("Macaw");

  if (parrot.rip) {
    console.log("This parrot is no more");
  }
  
}).call(this);