CoffeeScript - классы и наследование

JavaScript не предоставляет classключевое слово. Мы можем добиться наследования в JavaScript, используя объекты и их прототипы. У каждого объекта есть свой прототип, и они наследуют функции и свойства от своих прототипов. Поскольку прототип также является объектом, он также имеет свой собственный прототип.

Хотя прототипное наследование намного мощнее, чем классическое, для начинающих пользователей оно сложно и сбивает с толку.

Классы в CoffeeScript

Обращаясь к этой проблеме, CoffeeScript предоставляет базовую структуру, известную как classкоторый построен с использованием прототипов JavaScript. Вы можете определить класс в CoffeeScript, используя ключевое слово class, как показано ниже.

class Class_Name

пример

Рассмотрим следующий пример, здесь мы создали класс с именем Student используя ключевое слово class.

class Student

Если вы скомпилируете приведенный выше код, он сгенерирует следующий JavaScript.

var Student;

Student = (function() {
  function Student() {}

  return Student;

})();

Создание экземпляра класса

Мы можем создать экземпляр класса с помощью оператора new, как и в других объектно-ориентированных языках программирования, как показано ниже.

new Class_Name

Вы можете создать экземпляр созданного выше класса (Student), используя new оператор, как показано ниже.

class Student
new  Student

Если вы скомпилируете приведенный выше код, он сгенерирует следующий JavaScript.

var Student;

Student = (function() {
  function Student() {}

  return Student;

})();

new Student;

Определение конструктора

Конструктор - это функция, которая вызывается при создании экземпляра класса, ее основная цель - инициализировать переменные экземпляра. В CoffeeScript вы можете определить конструктор, просто создав функцию с именемconstructor как показано ниже.

class Student
  constructor: (name)->
  @name = name

Здесь мы определили конструктор и присвоили имя локальной переменной переменной экземпляра.

В @ оператор является псевдонимом для this ключевое слово, оно используется для указания переменных экземпляра класса.

Если мы разместим @перед аргументом конструктора, тогда он будет автоматически установлен как переменная экземпляра. Следовательно, приведенный выше код можно записать просто, как показано ниже -

class Student
  constructor: (@name)->

пример

Вот пример конструктора в CoffeeScript. Сохраните его в файл с именемconstructor_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

Откройте командную строку и скомпилируйте приведенный выше пример, как показано ниже.

c:\>coffee -c constructor_example.coffee

При выполнении вышеуказанной команды будет создан следующий код 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

Запустите приведенный выше пример, выполнив следующую команду в командной строке.

coffee constructor_example.coffee

При запуске приведенный выше пример дает следующий результат.

The name of the student is :Mohammed

Свойства экземпляра

Как и в случае с объектами, мы также можем иметь свойства внутри класса. И они известны какinstance properties.

пример

Рассмотрим следующий пример. Здесь мы создали переменные (имя, возраст) и функцию (message ()) внутри класса и получили к ним доступ с помощью ее объекта. Сохраните этот пример в файле с именемinstance_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()

При компиляции приведенный выше код генерирует следующий вывод.

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

Статические свойства

Мы можем определить статические свойства в классе. Объем статических свойств ограничен внутри класса, и мы создаем статические функции, используяthis keyword или его псевдоним @символ, и мы должны получить доступ к этим свойствам, используя имя класса как Class_Name.property .

пример

В следующем примере мы создали статическую функцию с именем message. и получил к нему доступ. Сохраните его в файл с именемstatic_properties_example.coffee.

#Defining a class
class Student
  @message:(name) ->
    "Hello "+name+" how are you" 
console.log Student.message("Raju")

Откройте командную строку и скомпилируйте указанный выше файл CoffeeScript, используя следующую команду.

c:\>coffee -c  static_properties_example.coffee

При компиляции вы получаете следующий код 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);

Выполните указанный выше coffeeScript в командной строке, как показано ниже.

c:\>coffee static_properties_example.coffee

При выполнении приведенный выше пример дает следующий результат.

Hello Raju how are you

Наследование

В CoffeeScript мы можем наследовать свойства одного класса в другом классе, используя extends ключевое слово.

пример

Ниже приведен пример наследования в CoffeeScript. Здесь у нас есть два класса, а именноAdd и My_class. Мы унаследовали свойства класса с именем Add в классе My_class и получили к ним доступ с помощьюextends ключевое слово.

#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 незаметно использует прототипное наследование. В CoffeeScript всякий раз, когда мы создаем экземпляры, вызывается конструктор родительского класса, пока мы его не переопределим.

Мы можем вызвать конструктор родительского класса из подкласса, используя super() ключевое слово, как показано в примере, приведенном ниже.

#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()

Динамические классы

CoffeeScript использует прототипное наследование для автоматического наследования всех свойств экземпляра класса. Это гарантирует, что классы динамичны; даже если вы добавляете свойства в родительский класс после создания дочернего, свойство все равно будет распространяться на все его унаследованные дочерние элементы.

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

При выполнении вышеуказанный CoffeeScript генерирует следующий код 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);