JavaScript 6週間の学習

7996 ワード

勉強する

  • オブジェクト向けプログラミングとは何ですか.
  • オブジェクト向けプログラミングの様々な論争.
  • 例1)オブジェクト向けプログラミングはすべてのプログラムを記述するのに適していますか?
  • 例2)オブジェクト向けプログラミングがもたらす問題.
  • 例3)それでも、オブジェクト向けプログラミングモードが最も広く使用されている理由である.
  • 例4)他のプログラミングモード(2以上)
  • オブジェクト向けプログラミングの4つの特性
  • 継承
  • カプセル化
  • 抽象
  • 多形性
  • スーパーキーワード
  • メソッド過負荷
  • overrideとoverridingの違いは
  • である.
  • ダイナミックメソッドの派遣
  • はどのように派遣されたのですか?
  • 抽象クラス
  • インタフェースと何が違いますか?
  • is-a関係、has-a関係
  • オブジェクト向けプログラミングとは


    オブジェクト向けプログラミングは、論理を状態と動作からなるオブジェクトにし、これらのオブジェクトの集合でプログラムを表現しようとするコンピュータプログラミングのモデルです.
    const circle = {
    radius = 5,   <- 상태 데이터
    getDiameter(){
    return 2 * this.radius <- 데이터를 조작하는 행위
    }
    }
    たとえば、円という名前のオブジェクトが半径を持つ状態では、半径データを操作することで直径を求める動作を行うことができます.
    このようなオブジェクト向けプログラミングは,オブジェクトとその状態を表すデータとそのデータを操作する行為を1つのユニットに置いて考え,オブジェクトの状態データをProperty,行為を方法と呼ぶ.

    オブジェクト向けプログラミングの様々な論争


    オブジェクト向けプログラミングはすべてのプログラムを作成するのに適していますか?


    オブジェクト向けプログラムは、プログラムで使用される様々なオブジェクトの情報を格納する必要があるため、限られたリソースのみを使用する環境(ex.imbeddyシステム)では、使用時に制限があります.

    オブジェクト向けプログラミングがもたらす可能性のある問題。


    プログラムを作成するには、そのプログラムで使用するオブジェクトを明確に理解する必要があるため、設計が複雑です.

    それでも,オブジェクト向けプログラミングモードは広く用いられている.


    モジュール化されており、他のプログラムでの再利用と再利用が容易であるため、生産性が向上します.

    オブジェクト向けプログラミングの4つの特性


    継承


    オブジェクトを指すpropertyまたはメソッドは、別のオブジェクトによって継承されて使用できます.継承されたクラスは親クラス(またはスーパークラス、ベースクラス)と呼ばれ、継承されたオブジェクトは子クラス(または派生クラス、子クラス)と呼ばれます.
    サブクラスは、親クラスのpropertyとメソッドを使用するか、必要な機能を追加することで拡張できます.
    class Base {
      constructor(name) {
        this.name = name;
      }
      sayhi(){
        return this.name;
      }
    }
    class Derived extends Base{} //<- Base 상속
    
    const derived = new Derived('Lee');
    console.log(derived.sayhi());

    カプセル化


    カプセル化とは,オブジェクトのプログラムと方法を組み合わせたものである.特に、オブジェクトを非表示にするための特定のプログラムまたは方法を、情報非表示と呼ぶ.これにより、外部開示を必要としないいくつかの実施を開示することを回避し、不適切なアクセスによるオブジェクト状態の変更を防止し、オブジェクト間の相互依存性を低減することができる.
    ほとんどのオブジェクト向けプログラミング言語では、public、private、protectedなどのアクセス制限子を使用して公開範囲を限定できます(共通宣言のプログラムおよびメソッドは外部から参照できますが、外部参照からprivateと宣言できない場合).
    JavaScriptではアクセス制限はサポートされていません.つまり、JavaScriptオブジェクトのすべてのプロパティとメソッドは基本的に公開されています.ただし、privateは以下のように使用できます.
    function Person(name,age) {
      this.name = name; //<-public
      let _age = age //<-private
    
      this.sayhi = function{
        console.log('my name is $(this.name) and my age is $(_age)');
      };
    }
    
    const me = new Person('Lee', 20);
    me.sayhi(); //<-'my name is Lee and my age is 20'
    console.log(me.name); //<- Lee
    console.log(me._age); //<-undefined

    抽象化


    オブジェクトには複数のプロパティがあります.これは、プログラムに必要ないくつかのプロパティのみを要約して使用することです.

    たけいせい


    特定の機能を宣言および実装セクションに分離し、実装セクションをさまざまな方法で作成および選択して使用可能にします.

    スーパーキー


    スーパーコール


    superを呼び出すと、スーパークラスのコンストラクション関数が呼び出されます.
    class Base(){
      constructors(a, b) {
        this.a = a;
        this.b = b
      }
    }
    
    class Dervied extends Base(){
      // constructors(...args) {super(...args)}  <-암묵적으로 생성
    }
    
    const derived = new Dervied(1, 2);
    console.log(derived) // derived{a:1, b:2}
    以上のように、スーパークラスのコンストラクタ内部にpropertyを有するインスタンスを追加すると、サブクラスのコンストラクタを省略することができる.
    class Base{
      constructors(a, b) {
        this.a = a;
        this.b = b
      }
    }
    
    class Dervied extends Base{
      constructor(a, b, c){
        super(a, b);
        this.c = c;
      }
    }
    
    const derived = new Dervied(1, 2, 3);
    console.log(derived) // derived{a:1, b:2, c:3}
    このとき、サブクラス生成を呼び出す引数のうち、スーパークラスのコンストラクション関数に渡す必要がある引数は、上記サブクラスのコンストラクション関数呼び出しのスーパーキーによって呼び出される.

    スーパーリファレンス


    superを参照すると、スーパークラスのメソッドを呼び出すことができます.
    class Base {
      constructor(name) {
        this.name = name;
      }
      sayhi(){
        return 'hi! ${this.name}';
      }
    }
    
    class Derived extends Base{
      sayhi(){
        return '${super.sayhi(). how are you doing?';
      }
    }
    const derived = new Derived('Lee');
    console.log(derived.sayhi()); //<-Lee, how are you doing?

    メソッドオーバーロード


    メソッドオーバーライドは、子クラスで親クラスの機能(メソッド)を再定義する際に使用される機能です.
    class Animal{
      constructor(name){
        this.name = name;
      }
      stop() {
        this.speed = 0;
      }
    }
    class Rabbit extends Animal{
      stop(){
        // rabbit.stop()을 호출할 때
        //Animal의 stop()이 아닌 이 메소드가 사용
      }
    }
    自分でメソッドを作成した後、プロシージャの前後で親メソッドを呼び出す場合は、スーパーキーを使用します.
    class Animal{
      constructor(name){
        this.name = name;
      }
      stop() {
        this.speed = 0;
      }
    }
    
    class Rabbit extends Animal{
      hide(){
        console.log('${this.name}이 숨었습니다.');
      }
      stop(){
        super.stop(); //부모 클래스의 stop()을 호출
        this.hide() //숨는다
      }
    }

    過負荷と過負荷の違い


    オーバーロードは、関数名が同じであるが、パラメータタイプまたは数が異なる方法を実装し、パラメータに基づいてメソッドを呼び出す方法です.
    JavaScriptではオーバーロードはサポートされていませんが、パラメータオブジェクトを使用して実装できます.

    ダイナミックメソッドの派遣


    どうしてDispatchが発生したのですか?


    抽象クラス


    たとえば、Animalというクラスが存在しますが、抽象的な概念を持つオブジェクトを1つだけ作成するのはよくありません.
    JavaScriptでは抽象クラスはサポートされていません.しかし、以下のように直接実現し継承する方法を用いることができる.
    class Abstract {
      constructor() {
        if (new.target === Abstract) {
          throw new TypeError("Cannot construct Abstract instances directly");
        }
      }
    }
    
    class Derived extends Abstract {
      constructor() {
        super();
        // more Derived-specific stuff here, maybe
      }
    }
    
    const a = new Abstract(); // new.target is Abstract, so it throws
    const b = new Derived(); // new.target is Derived, so no error

    インタフェースの違いは何ですか?


    インタフェースは抽象メソッドの集合であり,クラスとは異なりインスタンスを持つことはできない.JavaScriptはインタフェースをサポートしていません.

    is-a関係has-a関係


    is-a関係とは、ノートパソコンが1台のコンピュータであり、ノートパソコンが1台のコンピュータであるように、コンピュータという共通の属性を継承する関係を指す.
    has-a関係とはpolise has a gun,兵士has a gunのような子類が親類を持つ関係を指す.必ずしも継承する必要はありません.持っていなければ継承しないほうがいいです.
    ソース
  • https://opentutorials.org/course/743/6553
  • https://www.researchgate.net/post/what_are_the_advantages_and_disadvantages_of_object_oriented_programming
  • https://velog.io/@cyranocoding/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8DOOP-Object-Oriented-Programming-%EA%B0%9C%EB%85%90-%EB%B0%8F-%ED%99%9C%EC%9A%A9-%EC%A0%95%EB%A6%AC-igjyooyc6c
  • https://debugdaldal.tistory.com/151?category=927008
  • https://ko.javascript.info/class-inheritance
  • https://www.zerocho.com/category/JavaScript/post/59c17a58f40d2800197c65d6
  • https://stackoverflow.com/questions/29480569/does-ecmascript-6-have-a-convention-for-abstract-classes
  • https://parksb.github.io/article/1.html
  • https://jamesyleather.tistory.com/54