CoffeeScript-クラスと継承

JavaScriptは提供しません classキーワード。オブジェクトとそのプロトタイプを使用して、JavaScriptで継承を実現できます。すべてのオブジェクトには独自のプロトタイプがあり、プロトタイプから関数とプロパティを継承します。プロトタイプもオブジェクトであるため、独自のプロトタイプもあります。

プロトタイプの継承は従来の継承よりもはるかに強力ですが、初心者のユーザーにとっては困難で混乱を招きます。

CoffeeScriptのクラス

この問題に対処するために、CoffeeScriptは次のような基本構造を提供します。 classこれはJavaScriptのプロトタイプを使用して構築されています。以下に示すように、classキーワードを使用してCoffeeScriptでクラスを定義できます。

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

次の例を考えてみましょう。ここでは、クラス内に変数(name、age)と関数(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での継承の例です。ここでは、2つのクラスがあります。Add そして My_class。クラスMy_classのAddという名前のクラスのプロパティを継承し、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);