JavaScript(クラスのデフォルト)


カテゴリ
クラスの基本機能
C以外のすべてのプログラミング言語は,オブジェクト指向(object-oriented)というパターンに基づいて生成されるプログラミング言語である.
「対象に向かうパターン」とは,対象を優先してプログラムを作成する方法論である.
オブジェクト向けのプログラミング言語はクラスという構文を使用して、オブジェクト(object)をより効率的で安全にすることができ、オブジェクト向けのモードをプログラミングに容易に適用することができる.
抽象化
現在作成中のほとんどのプログラムでは、「どのデータを使用していますか?」と聞かれます.このような考えから始まります.
現実のオブジェクトには多くの属性があり、データであってもよい.例えば、「身長、体重、目の大きさ、鼻の大きさ」のようなものです.したがって,現実に存在するすべての情報をコンピュータ内部に完全に入力することはほとんど不可能である.
しかし、プログラムを書くときは、これらをすべて必要としません.病院が利用する業務手順を作るには、医師、看護師、患者、病室、予約記録、診療記録などの情報が必要であり、患者情報を利用すれば、患者の名前、生年月日、性別、連絡先などを知るだけだ.
同様に、プログラムに必要な要素のみを使用してオブジェクトを抽象(abstraction)と呼ぶ.より全面的な辞書の意義は複雑な資料、モジュール、システムなどの中から核心概念と機能を抽象化することである.
同じ形状のオブジェクトを作成
学生の成績管理計画を立てるべきだと思います.学生という対象が必要であり,これらの学生から成績管理に必要な共通事項を抽出することを抽象化と呼ぶ.
学生がたくさんいるので,抽出した要素は配列によって管理される.
コードを簡単に書く.
// 객체를 선언
const students = [];
students.push({ 이름: "구름", 국어: 87, 영어: 98, 수학: 88, 과학: 90 });
students.push({ 이름: "별이", 국어: 92, 영어: 98, 수학: 96, 과학: 88 });
students.push({ 이름: "겨울", 국어: 76, 영어: 96, 수학: 94, 과학: 86 });
students.push({ 이름: "바다", 국어: 98, 영어: 52, 수학: 98, 과학: 92 });

// 출력
console.log(JSON.stringify(students, null, 2));
JSON.stringify()オブジェクトをJSON文字列に変換する際に使用する方法.
実行
[
  {
    "이름": "구름",
    "국어": 87,
    "영어": 98,
    "수학": 88,
    "과학": 90
  },
  {
    "이름": "별이",
    "국어": 92,
    "영어": 98,
    "수학": 96,
    "과학": 88
  },
  {
    "이름": "겨울",
    "국어": 76,
    "영어": 96,
    "수학": 94,
    "과학": 86
  },
  {
    "이름": "바다",
    "국어": 98,
    "영어": 52,
    "수학": 98,
    "과학": 92
  }
]
上から出力されているのが見えます.
各オブジェクトに学生の成績合計と平均数を求める機能を追加すると、
// 객체를 선언
const students = [];
students.push({ 이름: "구름", 국어: 87, 영어: 98, 수학: 88, 과학: 90 });
students.push({ 이름: "별이", 국어: 92, 영어: 98, 수학: 96, 과학: 88 });
students.push({ 이름: "겨울", 국어: 76, 영어: 96, 수학: 94, 과학: 86 });
students.push({ 이름: "바다", 국어: 98, 영어: 52, 수학: 98, 과학: 92 });

// 출력
let output = `이름\t총점\t\t평균\n`;
for (const s of students) {
  const sum = s.국어 + s.영어 + s.수학 + s.과학;
  const average = sum / 4;
  output += `${s.이름}\t${sum} 점\t${average} 점\n`;
}

console.log(output);
複文を回し,内部で成績の総和を求め,これを基に平均値を求めればよい.実行時
이름	총점	  평균
구름	36390.75 점
별이	37493.5 점
겨울	35288 점
바다	34085
上から出力されているのが見えます.
オブジェクトを処理する関数
成績総和を求める機能と平均を求める機能は複数のプログラムで使用できる.したがって,単純計算に比べて関数とすることは拡張性を考慮した良い方法である.
getSumOf()とgetAverageOf()という関数を作成し、パラメータを使用して学生オブジェクトを受信し、合計と平均値を求めるプログラムを作成しようとします.
// 객체를 선언
const students = [];
students.push({ 이름: "구름", 국어: 87, 영어: 98, 수학: 88, 과학: 90 });
students.push({ 이름: "별이", 국어: 92, 영어: 98, 수학: 96, 과학: 88 });
students.push({ 이름: "겨울", 국어: 76, 영어: 96, 수학: 94, 과학: 86 });
students.push({ 이름: "바다", 국어: 98, 영어: 52, 수학: 98, 과학: 92 });

// 객체를 처리하는 함수를 선언
function getSumOf(student) {
  return student.국어 + student.영어 + student.수학 + student.과학;
}

function getAverageOf(student) {
  return getSumOf(student) / 4;
}

// 출력
let output = `이름\t총점\t\t평균\n`;
for (const s of students) {
  output += `${s.이름}\t${getSumOf(s)} 점\t${getAverageOf(s)} 점\n`;
}
console.log(output);
以上のように実行する
이름	총점		평균
구름	36390.75 점
별이	37493.5 점
겨울	35288 점
바다	34085
「≪オブジェクトの作成|Create Object|emdw≫」セクションと「≪オブジェクトの使用|Use Object|emdw≫」セクションに分けられます.コードは冗長だと思いますが、オブジェクトにより多くの機能を追加すると、オブジェクトをより簡単に維持でき、オブジェクトを使用するときにコードをより簡単に作成できます.
メソッドとしてオブジェクトを追加する機能
オブジェクトの数が増えるにつれて、関数名の競合が発生する可能性があります.また、パラメータにどのタイプのオブジェクトが含まれているか分からないため、関数を使用すると混同される可能性があります.これらの問題を解決するには、getaverageOfStudio()のように長い関数名を記述して意味を理解できますが、コードの読み取りが悪いという問題が発生する可能性があります.
そこで,開発者は関数をメソッドとしてオブジェクト内部に入れる方法を用い始めた.次に、繰り返し文を使用して、getSum()メソッドとgetAverage()メソッドをすべてのオブジェクトに追加します.
// 객체를 선언
const students = [];
students.push({ 이름: "구름", 국어: 87, 영어: 98, 수학: 88, 과학: 90 });
students.push({ 이름: "별이", 국어: 92, 영어: 98, 수학: 96, 과학: 88 });
students.push({ 이름: "겨울", 국어: 76, 영어: 96, 수학: 94, 과학: 86 });
students.push({ 이름: "바다", 국어: 98, 영어: 52, 수학: 98, 과학: 92 });

// students 배열 내부의 객체 모두에 메소드를 추가
for (const student of students) {
  student.getSum = function () {
    return this.국어 + this.영어 + this.수학 + this.과학;
  };

  student.getAverage = function () {
    return this.getSum() / 4;
  };
}

// 출력
let output = `이름\t총점\t\t평균\n`;
for (const s of students) {
  output += `${s.이름}\t${s.getSum()} 점\t${s.getAverage()} 점\n`;
}
console.log(output);
結果は以上の通りです.これにより、関数名の競合を回避したり、関数を誤って使用したりすることを減らすことができます.
これまで,オブジェクトの価値と値は入力によって生成されてきた.関数を使用してオブジェクトを印刷する場合.関数を作成するだけで、オブジェクトを簡単に作成できます.
function createStudent(name, Kor, Eng, Mat, Sci) {
  return {
    // 속성을 선언
    name: name,
    Kor: Kor,
    Eng: Eng,
    Mat: Mat,
    Sci: Sci,

    // 메소드 선언
    getSum() {
      return this.Kor + this.Eng + this.Mat + this.Sci;
    },

    getAverage() {
      return this.getSum() / 4;
    },

    toString() {
      return `${this.name}\t${this.getSum()} 점\t${this.getAverage()} 점\n`;
    },
  };
}

// 객체를 선언
const students = [];
students.push(createStudent("구름", 87, 98, 88, 90));
students.push(createStudent("별이", 92, 98, 96, 88));
students.push(createStudent("겨울", 76, 96, 94, 86));
students.push(createStudent("겨울", 98, 52, 98, 92));

// 출력
let output = `이름\t총점\t\t평균\n`;
for (const s of students) {
  output += s.toString();
}

console.log(output);
実行結果は上記のとおりです.
createStudio()関数を作成し、オブジェクトを作成して戻します.
このように関数を作ると多くのメリットが得られます.
1つ以上のオブジェクトを作成するよりも、
  • 誤字の危険を減らす.
  • コードの入力数が大幅に減少しました.
  • 1つの関数で
  • のプロパティとメソッドを管理することで、オブジェクトをより簡単に維持できます.
  • しかし、現在のコードには見えない問題があります.オブジェクトごとにgetSum()メソッド、getAverage()メソッド、toString()メソッドが生成されるため、関数よりも重いデータ型が複数回生成されます.
    クラスの宣言
    オブジェクトを定義し、これらのオブジェクト作成プログラムをオブジェクト向けプログラミングと呼びます.
    プログラミング言語の開発者は、2つの構文(クラス)とプロトタイプ(prototype)でオブジェクトを効率的に作成できます.簡単に区別すると.
  • クラス:
  • 構文には多くの制限がありますが、オブジェクトの作成時に多くのサポートは提供されません.
  • プロトタイプ:制限はありませんが、サポートされていない構文
  • 現在使用されているほとんどのオブジェクト向けプログラミング言語では、クラス構文が提供されています.JAvascriptは初期にプロトタイプ構文を提供したが、時代の発展に伴い、すべてのクラス構文の勝利に伴い、最新のjavascriptはクラス構文を提供し始めた.
    クラスは次のように生成されます.
    class 클래스이름 {
    
    }
    クラスに基づいて作成されたオブジェクトは、専門用語としてインスタンス(instance)と呼ばれます.対象と呼ぶ人も多い.インスタンスを作成するときは、次の構文を使用します.
    new 클래스이름()
    クラスとインスタンスは、以下のことを簡単に考慮できます.
  • クラス:以前に表示したオブジェクトの作成と同様の関数
  • インスタンス(オブジェクト):以前に作成したオブジェクトの関数を使用して作成したオブジェクトと同様
    学生を表すStudioクラスを作成し、インスタンスを生成するコードを作成します.
    // 클래스 선언
    class Student {
    
    }
    
    // 학생을 선언
    const student = new Student()
    
    // 학생 리스트를 선언
    const students = [
      new Student(),
      new Student(),
      new Student(),
      new Student()
    ]
    ちなみに、開発者の承諾はクラス名の頭文字を大文字にすることです.最初の文字を小文字に指定してもエラーは発生しませんが、最初の文字を大文字にする約束を守ったほうがいいです.識別子だけを見てもすぐにクラスとして理解できます.
    生成者
    新しいStudent()コードでは、Studentの後ろに関数のように括弧を開いて閉じる記号があります.これはコンストラクション関数(constructor)という関数で、オブジェクトの作成時に呼び出されます.ジェネレータは次の形式で作成されます.メソッドの名前はconstructorとして指定されますが、constructorではなくnew Studio()のようにクラス名が呼び出されます.
    class 클래스이름 {
    	constructor() {
    		/* 생성자 코드 */
    	}
    }
    ジェネレータは、クラスに基づいてインスタンスを作成するときに最初に呼び出される方法です.これにより、ジェネレータはオブジェクトの初期化処理(属性の追加など)を行います.
    class Student {
      constructor(name, Kor, Eng, Mat, Sci) {
        this.name = name;
        this.Kor = Kor;
        this.Eng = Eng;
        this.Mat = Mat;
        this.Sci = Sci;
      }
    }
    
    // 객체 선언
    const students = [];
    students.push(new Student("구름", 87, 98, 88, 90));
    students.push(new Student("별이", 92, 98, 96, 88));
    students.push(new Student("겨울", 76, 96, 94, 86));
    students.push(new Student("겨울", 98, 52, 98, 92));
    方法
    メソッド(method)は、次の形式で追加されます.このようにすると,内部ではメソッドが繰り返されず,1つのメソッドのみが生成されて使用される.
    class Student {
      constructor(name, Kor, Eng, Mat, Sci) {
        this.name = name;
        this.Kor = Kor;
        this.Eng = Eng;
        this.Mat = Mat;
        this.Sci = Sci;
      }
    
      getSum() {
        return this.Kor + this.Eng + this.Mat + this.Sci;
      }
    
      getAverage() {
        return this.getSum() / 4;
      }
    
      toString() {
        return `${this.name}\t${this.getSum()} 점\t${this.getAverage()} 점\n`;
      }
    }
    
    // 객체 선언
    const students = [];
    students.push(new Student("구름", 87, 98, 88, 90));
    students.push(new Student("별이", 92, 98, 96, 88));
    students.push(new Student("겨울", 76, 96, 94, 86));
    students.push(new Student("겨울", 98, 52, 98, 92));
    
    // 출력
    let output = "이름\t총점\t\t평균\n";
    for (const s of students) {
      output += s.toString();
    }
    
    console.log(output);
    実行結果は上記のとおりです.
    5つのキーワード
  • オブジェクト指向パターンとは、オブジェクトを優先してプログラムを作成する方法論を指す.
  • 抽象は、プログラムに必要な要素のみを使用してオブジェクトを表すことを意味する.
  • クラスは、オブジェクトを安全かつ効率的にする構文です.
  • インスタンスは、クラスに基づいて作成されたオブジェクトを表します.
  • ジェネレータは、クラスに基づいてインスタンスを生成するときに呼び出される方法である.