CoffeeScript - Classi ed ereditarietà

JavaScript non fornisce l'estensione classparola chiave. Possiamo ottenere l'ereditarietà in JavaScript utilizzando oggetti e i loro prototipi. Ogni oggetto ha il proprio prototipo ed eredita funzioni e proprietà dai propri prototipi. Poiché il prototipo è anche un oggetto, ha anche un proprio prototipo.

Sebbene l'ereditarietà prototipale sia molto più potente dell'ereditarietà classica, è difficile e confusa per gli utenti inesperti.

Classi in CoffeeScript

Affrontando questo problema, CoffeeScript fornisce una struttura di base nota come classche è costruito utilizzando i prototipi di JavaScript. È possibile definire una classe in CoffeeScript utilizzando la parola chiave class come mostrato di seguito.

class Class_Name

Esempio

Considera il seguente esempio, qui abbiamo creato una classe denominata Student utilizzando la parola chiave class.

class Student

Se compili il codice sopra, genererà il seguente JavaScript.

var Student;

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

  return Student;

})();

Istanziare una classe

Possiamo istanziare una classe usando l'operatore new proprio come altri linguaggi di programmazione orientati agli oggetti come mostrato di seguito.

new Class_Name

È possibile istanziare la classe (Studente) creata sopra utilizzando il file new operatore come mostrato di seguito.

class Student
new  Student

Se compili il codice sopra, genererà il seguente JavaScript.

var Student;

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

  return Student;

})();

new Student;

Definizione di un costruttore

Un costruttore è una funzione che viene invocata quando istanziamo una classe, il suo scopo principale è inizializzare le variabili di istanza. In CoffeeScript, puoi definire un costruttore semplicemente creando una funzione con nomeconstructor come mostrato di seguito.

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

Qui abbiamo definito un costruttore e assegnato il nome della variabile locale alla variabile di istanza.

Il @ l'operatore è un alias di this parola chiave, viene utilizzata per puntare le variabili di istanza di una classe.

Se posizioniamo @prima di un argomento del costruttore, verrà impostato automaticamente come variabile di istanza. Pertanto, il codice sopra può essere scritto semplicemente come mostrato di seguito -

class Student
  constructor: (@name)->

Esempio

Ecco un esempio di un costruttore in CoffeeScript. Salvalo in un file con il nomeconstructor_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

Apri il prompt dei comandi e compila l'esempio sopra come mostrato di seguito.

c:\>coffee -c constructor_example.coffee

Quando si esegue il comando precedente, verrà prodotto il seguente 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

Eseguire l'esempio precedente eseguendo il comando seguente sul prompt dei comandi.

coffee constructor_example.coffee

In esecuzione, l'esempio precedente fornisce il seguente output.

The name of the student is :Mohammed

Proprietà istanza

Come negli oggetti, possiamo anche avere proprietà all'interno di una classe. E questi sono conosciuti comeinstance properties.

Esempio

Considera il seguente esempio. Qui, abbiamo creato variabili (nome, età) e una funzione (messaggio ()) all'interno della classe e vi abbiamo acceduto utilizzando il suo oggetto. Salva questo esempio in un file denominatoinstance_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 momento della compilazione, il codice precedente genera il seguente output.

// 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);

Proprietà statiche

Possiamo definire proprietà statiche nella classe. L'ambito delle proprietà statiche è limitato all'interno della classe e creiamo funzioni statiche utilizzando ilthis keyword o il suo alias @symbol e dobbiamo accedere a queste proprietà usando il nome della classe come Class_Name.property .

Esempio

Nell'esempio seguente, abbiamo creato una funzione statica denominata message. e accedervi. Salvalo in un file con il nomestatic_properties_example.coffee.

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

Apri il prompt dei comandi e compila il file CoffeeScript sopra utilizzando il seguente comando.

c:\>coffee -c  static_properties_example.coffee

Durante la compilazione, ti dà il seguente 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);

Esegui il coffeeScript sopra nel prompt dei comandi come mostrato di seguito.

c:\>coffee static_properties_example.coffee

Durante l'esecuzione, l'esempio precedente fornisce il seguente output.

Hello Raju how are you

Eredità

In CoffeeScript, possiamo ereditare le proprietà di una classe in un'altra classe usando extends parola chiave.

Esempio

Di seguito è riportato un esempio di ereditarietà in CoffeeScript. Qui abbiamo due classi, vale a direAdd e My_class. Abbiamo ereditato le proprietà della classe denominata Add nella classe My_class e vi abbiamo acceduto utilizzando ilextends parola chiave.

#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 utilizza l'eredità prototipale dietro le quinte. In CoffeeScript, ogni volta che creiamo istanze, il costruttore della classe genitore viene invocato fino a quando non lo sovrascriviamo.

Possiamo invocare il costruttore della classe genitore dalla sottoclasse, usando il super() parola chiave come mostrato nell'esempio riportato di seguito.

#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()

Classi dinamiche

CoffeeScript utilizza l'ereditarietà prototipale per ereditare automaticamente tutte le proprietà di istanza di una classe. Ciò garantisce che le classi siano dinamiche; anche se aggiungi proprietà a una classe genitore dopo che un figlio è stato creato, la proprietà verrà comunque propagata a tutti i suoi figli ereditati.

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

All'esecuzione, il CoffeeScript di cui sopra genera il seguente codice 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);