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