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