CoffeeScript - klasy i dziedziczenie
JavaScript nie zapewnia classsłowo kluczowe. Dziedziczenie możemy osiągnąć w JavaScript używając obiektów i ich prototypów. Każdy obiekt ma swój własny prototyp i dziedziczy funkcje i właściwości po swoich prototypach. Ponieważ prototyp jest również obiektem, ma również swój własny prototyp.
Chociaż dziedziczenie prototypowe jest znacznie potężniejsze niż dziedziczenie klasyczne, jest trudne i mylące dla początkujących użytkowników.
Zajęcia w CoffeeScript
Rozwiązując ten problem, CoffeeScript zapewnia podstawową strukturę znaną jako classktóry jest zbudowany przy użyciu prototypów JavaScript. Możesz zdefiniować klasę w CoffeeScript za pomocą słowa kluczowego class, jak pokazano poniżej.
class Class_Name
Przykład
Rozważmy następujący przykład, tutaj utworzyliśmy klasę o nazwie Student używając słowa kluczowego class.
class Student
Jeśli skompilujesz powyższy kod, wygeneruje on następujący JavaScript.
var Student;
Student = (function() {
function Student() {}
return Student;
})();
Tworzenie wystąpienia klasy
Możemy utworzyć instancję klasy przy użyciu operatora new, podobnie jak inne języki programowania obiektowego, jak pokazano poniżej.
new Class_Name
Możesz utworzyć wystąpienie powyższej utworzonej klasy (Student) przy użyciu new operator, jak pokazano poniżej.
class Student
new Student
Jeśli skompilujesz powyższy kod, wygeneruje on następujący JavaScript.
var Student;
Student = (function() {
function Student() {}
return Student;
})();
new Student;
Definiowanie konstruktora
Konstruktor to funkcja wywoływana podczas tworzenia instancji klasy, której głównym celem jest zainicjowanie zmiennych instancji. W CoffeeScript można zdefiniować konstruktor, po prostu tworząc funkcję o nazwieconstructor jak pokazano niżej.
class Student
constructor: (name)->
@name = name
Tutaj zdefiniowaliśmy konstruktor i przypisaliśmy nazwę zmiennej lokalnej do zmiennej instancji.
Plik @ operator jest aliasem do this słowo kluczowe służy do wskazywania zmiennych instancji klasy.
Jeśli umieścimy @przed argumentem konstruktora, zostanie automatycznie ustawiona jako zmienna instancji. Dlatego powyższy kod można zapisać w prosty sposób, jak pokazano poniżej -
class Student
constructor: (@name)->
Przykład
Oto przykład konstruktora w CoffeeScript. Zapisz go w pliku o nazwieconstructor_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
Otwórz wiersz polecenia i skompiluj powyższy przykład, jak pokazano poniżej.
c:\>coffee -c constructor_example.coffee
Po wykonaniu powyższego polecenia wygeneruje następujący kod 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
Uruchom powyższy przykład, wykonując następujące polecenie w wierszu polecenia.
coffee constructor_example.coffee
Podczas pracy powyższy przykład daje następujące dane wyjściowe.
The name of the student is :Mohammed
Właściwości instancji
Podobnie jak w przypadku obiektów, możemy również mieć właściwości wewnątrz klasy. A te są znane jakoinstance properties.
Przykład
Rozważmy następujący przykład. Tutaj utworzyliśmy zmienne (imię, wiek) i funkcję (message ()) w klasie i uzyskaliśmy do nich dostęp za pomocą jej obiektu. Zapisz ten przykład w pliku o nazwieinstance_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()
Podczas kompilacji powyższy kod generuje następujące dane wyjściowe.
// 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);
Właściwości statyczne
W klasie możemy zdefiniować właściwości statyczne. Zakres właściwości statycznych jest ograniczony w ramach klasy, a funkcje statyczne tworzymy za pomocąthis keyword lub jego alias @symbol i musimy uzyskać dostęp do tych właściwości, używając nazwy klasy jako nazwa_klasy.właściwość .
Przykład
W poniższym przykładzie utworzyliśmy statyczną funkcję o nazwie message. i uzyskałem do niego dostęp. Zapisz go w pliku o nazwiestatic_properties_example.coffee.
#Defining a class
class Student
@message:(name) ->
"Hello "+name+" how are you"
console.log Student.message("Raju")
Otwórz wiersz polecenia i skompiluj powyższy plik CoffeeScript za pomocą następującego polecenia.
c:\>coffee -c static_properties_example.coffee
Podczas kompilacji daje następujący 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);
Wykonaj powyższy coffeeScript w wierszu poleceń, jak pokazano poniżej.
c:\>coffee static_properties_example.coffee
Podczas wykonywania powyższy przykład daje następujące dane wyjściowe.
Hello Raju how are you
Dziedzictwo
W CoffeeScript możemy dziedziczyć właściwości jednej klasy z innej klasy używając extends słowo kluczowe.
Przykład
Poniżej znajduje się przykład dziedziczenia w CoffeeScript. Tutaj mamy dwie klasy, a mianowicieAdd i My_class. Odziedziczyliśmy właściwości klasy o nazwie Add w klasie My_class i uzyskaliśmy do nich dostęp za pomocąextends słowo kluczowe.
#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 wykorzystuje dziedziczenie prototypowe za kulisami. W CoffeeScript za każdym razem, gdy tworzymy instancje, wywoływany jest konstruktor klasy nadrzędnej, dopóki go nie przesłonimy.
Możemy wywołać konstruktor klasy nadrzędnej z podklasy, używając super() słowo kluczowe, jak pokazano w przykładzie podanym poniżej.
#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()
Klasy dynamiczne
CoffeeScript używa dziedziczenia prototypowego, aby automatycznie dziedziczyć wszystkie właściwości instancji klasy. Gwarantuje to, że klasy są dynamiczne; nawet jeśli dodasz właściwości do klasy nadrzędnej po utworzeniu dziecka, właściwość będzie nadal propagowana do wszystkich jego dziedziczonych elementów podrzędnych.
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
Podczas wykonywania powyższy CoffeeScript generuje następujący kod 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);