JavaScript対象向けプログラミング


オブジェクト指向プログラミング
6.1理解対象Object.defineProperties Object.defineProperty 1.データ属性-configrable-enumerable-writable-value 2.アクセス器属性-get-set-configrable-enumerable
"use strict";
var book = {
    _year: 2004,//      ,                 。_
    edition: 1,
    visTimes:0
};

Object.defineProperty(book, 'year', {   //    year     
    get: function() {
        this.visTimes++;
        return this._year;
    },
    set: function(newValue) {
        if (newValue > 2004) {
            this._year = newValue;
            this.edition += newValue - 2004;
        }
    },
    enumerable:false,
    configurable:true
});

book.year = 2005;
Object.getOwnPropertyDescriptor(book,"year");
カスタムアクセス属性を設定するgetとset方法により、アクセス回数を記録するなど多くのことができます.
  • Object.getOwn PropertyDescriptor(book,year)属性の特性を読み出す
  • 6.2オブジェクトを作成する
    6.2.1工場モード
    具体的なオブジェクトを作成するプロセスを抽象化しました.
    function createPerson (name,age,job){
      var o = new Object();
      o.name = name;
      o.age = age;
      o.job = job;
      o.sayName = function(){
        console.log(this.name);
      }
      return o;
    }
    6.2.2コンストラクタモード
    構造と工場の違い:1.表示されていない作成対象2.直接属性と方法をthisオブジェクトに与えました.3.return文がありません.
    function Person(name,age,job){
        this.name = name;
        this.age = age;
        this.job = job;
        this.sayName = function () {
            console.log(this.name);
        }
    }
    var person = new Person("wilson",20,"student");
    person.sayName();  //       
    
    Person("wilson2",21,"student"); //       
    window.sayName();
    var o = new Object();
    Person.apply(o,["wilson3",22,"student"]) //             
    o.sayName();
    コンストラクタの4つのステップ:1.新しいオブジェクトを作成します.2.コンストラクタのスコープを新しいオブジェクトに割り当てます.3.コンストラクタのコードを実行します.4.新しいオブジェクトを返します.
    注:カスタム関数を作成するコンストラクタは、彼のインスタンスを特定のタイプとして識別することを意味します.これも工場モデルよりも構造パターンが優れているところです.
    コンストラクタの問題:各方法は各インスタンスで再作成されます.
    6.2.3プロトタイプモード
    私たちが作成した各関数には、prototype属性があります.この属性は、オブジェクトを指すポインタであり、このオブジェクトの用途は、特定のタイプのすべてのインスタンスによって共有できる属性と方法を含むものです.
    プロトタイプの問題:第一:プロトタイプに属性が参照タイプがあると、そのプロトタイプを継承したすべてのインスタンスは一つの属性の参照タイプを共有します.第二に、サブタイプのインスタンスを作成すると、超タイプの構造関数にパラメータを転送できません.
    6.2.4コンストラクタモードとプロトタイプモードを使用する
    構造関数モードは、例示的な属性を定義するために使用され、プロトタイプパターンは、方法と共有の属性を定義するために使用されます.結果として、各インスタンスは、自分のインスタンス属性のコピーを持っていますが、方法の参照を共有しながら、メモリを最大限に節約します.さらに,構造関数へのパラメータの伝達も支援した.
    6.2.5ダイナミックプロトタイプモード
    プロトタイプを初期化する必要があるかどうかは、あるべき方法が有効かどうかを検出することによって決定される.
    6.3継承
    6.3.1プロトタイプチェーン
    方法:原型オブジェクトを別のタイプのインスタンスに向ける
    6.3.2構造関数を借りる
    function SuperType(){
        this.property = true;
    }
    function SubType(){
        SuperType.call(this,"wilson"); //   SuperType,         
        this.age = 20;
    }
    var instance = new SubType();
    6.3.3グループ引継ぎ
    プロトタイプチェーンを使用してプロトタイプの属性と方法の継承を実現し,構造関数を借りることによってインスタンス属性の継承を実現した.複合継承はプロトタイプ鎖と借用構造関数の欠陥を回避し,両者の利点を融合させた.
    6.3.4原型式継承
    プロトタイプに基づいて既存のオブジェクトに基づいて作成することができます.
    function object(o){
      function F(){}
      F.prototype = o;
      return new F();
    }
       ECMA5   Object.create()
    6.3.5寄生式引継ぎ
    プロトタイプ継承と密接に関連しており、パッケージ継承プロセスに使用されます.
    function createAnother(original){
     "use strict";
        var clone = Object.create(original);
        clone.sayHi = function () {
            alert("hi");
        };
        return clone;
    }
    6.3.6寄生結合式継承
    結合継承はどの場合でも二次構造関数を呼び出すからである.一度はサブタイプのプロトタイプを作成するとき、二番目はサブタイプのコンストラクタの内部にある.サブタイプのプロトタイプを最初に作成すると、構造関数の属性は継承されますが、プロトタイプのオブジェクトに格納され、2回目にオブジェクトを作成して、プロトタイプのオブジェクトに格納されている属性を上書きします.