TIL14: OOP/Inheritance Patterns


オブジェクト向けのプログラミングでは、Instantiation Patternsは「パッケージ」と「抽象」についてある程度理解しています.Inheritance Patternsによって「継承」と「多形性」を理解します.
  • Pseudoclassicalから「継承」
    まずプロトタイプチェーン接続を使用します(Instance.__proto__ === Class.prototype)メソッドとHuman.prototypeを使用してStudio.prototypeを作成してObject.create()を接続します).
    でもこの時Studentプロトタイプ作成中、Studio.prototype.コンストラクション関数もHumanprototype.Student.prototype.コンストラクション関数がStudioオブジェクトを参照することを指定する必要があります.Human()を呼び出して、Studioオブジェクトに入力された伝達係数をHumanオブジェクトに渡す場合、 call()またはapply()の方法を使用してStudioオブジェクトの実行コンテキスト「this」を共有する必要があります.
  • var Human = function(name) {
      this.name = name;
    }
    Human.prototype.sleep = function() {
      console.log('zzz');
    };
    
    var Student = function(name) {
      // 3. Human 객체로부터 Student객체로 상속: Execution Context('this') 공유
      Human.call(this, name);
      // Human.apply(this, arguments); 
    };
    // 1. prototype chain 연결
    Student.prototype = Object.create(Human.prototype);
    // 2. constructor 연결
    Student.prototype.constructor = Student;
    Student.protytype.learn = function() {
      console.log('learning');
    };
    
    var steve = new Human('steve');
    steve instanceof Human; // true
    steve.__proto__ === Human.prototype; // true
    steve instanceof Student; // false
    steve.__proto__ === Student.prototype; // false
    
    var john = new Student('john');
    john instanceof Human; // true
    john instanceof Student; // true
    john.__proto__ === Student.prototype; // true
    john.__proto__ === Human.prototype; // false
  • Pseudoclasicの「多形性」
    これに先立ち,プロトタイプとコンストラクション関数の関係を明らかにし,親オブジェクトと子オブジェクトの継承によって属性とメソッド,および「this」を伝達する.
    一方、子オブジェクトのメソッド機能を拡張して、親オブジェクトのメソッドと子オブジェクトのメソッドの実行結果が異なるようにすることもできます.親オブジェクトのメソッドを呼び出すときに、 call()またはapply()メソッドを使用して実行コンテキストを共有することもできます.その後、機能を追加することで多様化を実現できます.
  • // 다형성 구현: 메소드 확장
    Student.prototype.sleep = function() {
      Human.prototype.sleep.call(this);
      console.log('do not sleep');
    };
    
    var steve = new Human('steve');
    steve.sleep(); // 'zzz'
    steve.learn(); // TypeError
    
    var john = new Student('john');
    john.sleep(); // 'zzz' 'do not sleep'
    john.learn(); // 'learning'
    コードおよびリソースソース:コードステータス