CoffeeScript - Classes e herança

JavaScript não fornece o classpalavra-chave. Podemos obter herança em JavaScript usando objetos e seus protótipos. Cada objeto tem seu próprio protótipo e herdam funções e propriedades de seus protótipos. Como o protótipo também é um objeto, ele também possui seu próprio protótipo.

Embora a herança prototípica seja muito mais poderosa do que a herança clássica, é difícil e confusa para usuários novatos.

Aulas em CoffeeScript

Para resolver esse problema, CoffeeScript fornece uma estrutura básica conhecida como classque é construído usando os protótipos do JavaScript. Você pode definir uma classe em CoffeeScript usando a palavra-chave class conforme mostrado abaixo.

class Class_Name

Exemplo

Considere o exemplo a seguir, aqui criamos uma classe chamada Student usando a palavra-chave class.

class Student

Se você compilar o código acima, ele irá gerar o seguinte JavaScript.

var Student;

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

  return Student;

})();

Instanciando uma classe

Podemos instanciar uma classe usando o operador new, assim como outras linguagens de programação orientadas a objetos, conforme mostrado abaixo.

new Class_Name

Você pode instanciar a classe criada acima (Aluno) usando o new operador como mostrado abaixo.

class Student
new  Student

Se você compilar o código acima, ele irá gerar o seguinte JavaScript.

var Student;

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

  return Student;

})();

new Student;

Definindo um Construtor

Um construtor é uma função que é chamada quando instanciamos uma classe, seu objetivo principal é inicializar as variáveis ​​de instância. No CoffeeScript, você pode definir um construtor apenas criando uma função com o nomeconstructor como mostrado abaixo.

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

Aqui, definimos um construtor e atribuímos o nome da variável local à variável de instância.

o @ operador é um alias para o this palavra-chave, é usada para apontar as variáveis ​​de instância de uma classe.

Se colocarmos @antes de um argumento do construtor, então ele será definido como uma variável de instância automaticamente. Portanto, o código acima pode ser escrito simplesmente como mostrado abaixo -

class Student
  constructor: (@name)->

Exemplo

Aqui está um exemplo de um construtor em CoffeeScript. Salve-o em um arquivo com o 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

Abra o prompt de comando e compile o exemplo acima conforme mostrado abaixo.

c:\>coffee -c constructor_example.coffee

Ao executar o comando acima, ele produzirá o seguinte 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

Execute o exemplo acima executando o seguinte comando no prompt de comando.

coffee constructor_example.coffee

Em execução, o exemplo acima fornece a seguinte saída.

The name of the student is :Mohammed

Propriedades da instância

Da mesma forma que em objetos, também podemos ter propriedades dentro de uma classe. E estes são conhecidos comoinstance properties.

Exemplo

Considere o seguinte exemplo. Aqui, criamos variáveis ​​(nome, idade) e uma função (mensagem ()) dentro da classe e as acessamos usando seu objeto. Salve este exemplo em um arquivo chamadoinstance_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()

Na compilação, o código acima gera a seguinte saída.

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

Propriedades estáticas

Podemos definir propriedades estáticas na classe. O escopo das propriedades estáticas é restrito dentro da classe e criamos funções estáticas usando othis keyword ou seu apelido @símbolo e temos que acessar essas propriedades usando o nome da classe como Class_Name.property .

Exemplo

No exemplo a seguir, criamos uma função estática chamada mensagem. e acessou. Salve-o em um arquivo com o nomestatic_properties_example.coffee.

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

Abra o prompt de comando e compile o arquivo CoffeeScript acima usando o seguinte comando.

c:\>coffee -c  static_properties_example.coffee

Na compilação, ele fornece o seguinte 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);

Execute o coffeeScript acima no prompt de comando, conforme mostrado abaixo.

c:\>coffee static_properties_example.coffee

Ao executar, o exemplo acima fornece a seguinte saída.

Hello Raju how are you

Herança

No CoffeeScript, podemos herdar as propriedades de uma classe em outra classe usando extends palavra-chave.

Exemplo

A seguir está um exemplo de herança em CoffeeScript. Aqui, temos duas classes, a saberAdd e My_class. Herdamos as propriedades da classe chamada Add na classe My_class e as acessamos usando oextends palavra-chave.

#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 usa herança prototípica nos bastidores. Em CoffeeScript, sempre que criamos instâncias, o construtor da classe pai é invocado até que o substituamos.

Podemos invocar o construtor da classe pai da subclasse, usando o super() palavra-chave conforme mostrado no exemplo dado abaixo.

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

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

Classes Dinâmicas

CoffeeScript usa herança prototípica para herdar automaticamente todas as propriedades de instância de uma classe. Isso garante que as classes sejam dinâmicas; mesmo se você adicionar propriedades a uma classe pai após a criação de um filho, a propriedade ainda será propagada para todos os seus filhos herdados.

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

Ao ser executado, o CoffeeScript acima gera o seguinte 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);