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