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